
コンピュータの世界では、クラッシュ、またはシステムクラッシュとは、ソフトウェアアプリケーションやオペレーティングシステムなどのコンピュータプログラムが正常に動作しなくなり、終了してしまうことを指します。一部のオペレーティングシステムや個々のアプリケーションでは、クラッシュレポートサービスがクラッシュとその詳細を(またはユーザーにそのオプションを提供する形で)報告し、通常はアプリケーションの開発者に通知します。プログラムがオペレーティングシステムの重要な部分である場合、システム全体がクラッシュまたはハングアップし、カーネルパニックや致命的なシステムエラーが発生することがよくあります。
ほとんどのクラッシュはソフトウェアのバグが原因です。典型的な原因としては、無効なメモリ アドレスへのアクセス、プログラムカウンタのアドレス値の誤り、バッファオーバーフロー、以前のバグによる影響を受けるプログラム コードの一部の上書き、無効なマシン 命令(不正または許可されていないオペ コード) の実行、または未処理の例外の発生などが挙げられます。この一連の事象を引き起こした元のソフトウェア バグが、通常はクラッシュの原因と考えられ、デバッグプロセスを通じて発見されます。元のバグは、実際にクラッシュを引き起こしたコードから大きく離れている場合があります。
初期のパーソナルコンピュータでは、システムのメインメモリ以外のハードウェアアドレスにデータを書き込もうとすると、ハードウェアが損傷する可能性があった。一部のクラッシュは悪用可能であり、悪意のあるプログラムやハッカーが任意のコードを実行できるため、ウイルスの複製や、通常はアクセスできないデータの取得が可能になる。

アプリケーションは通常、オペレーティングシステムによって許可されていない操作を実行するとクラッシュします。すると、オペレーティングシステムはアプリケーション内で例外またはシグナルを発生させます。従来、Unix アプリケーションはコアダンプによってシグナルに応答していました。ほとんどの Windows および Unix GUIアプリケーションは、デバッガがインストールされている場合はデバッガをアタッチするオプションを含むダイアログボックス (右側の添付画像に示されているものなど) を表示して応答します。一部のアプリケーションは、エラーから回復して終了する代わりに実行を継続しようとします。
アプリケーションには、重大なエラーを検出した後にクラッシュするコードも含まれる場合があります[ b ] 。
アプリケーションのクラッシュを引き起こす典型的なエラーには、以下のようなものがあります。


「デスクトップへのクラッシュ」(CTD)とは、プログラム(一般的にはビデオゲーム)が予期せず終了し、ユーザーが突然デスクトップに戻されるときに発生すると言われます。通常、この用語はエラーが表示されない場合のクラッシュにのみ適用され、クラッシュの結果としてユーザーが見るのはデスクトップだけです。多くの場合、デスクトップへのクラッシュを引き起こす明らかな操作はありません。通常の動作中に、プログラムが短時間フリーズし、その後自動的に終了することがあります。また、通常の動作中に、プログラムが黒い画面になり、デスクトップにクラッシュする直前に再生されていた最後の数秒間の音声(オーディオバッファのサイズによって異なります)が繰り返し再生されることがあります。また、エリアの読み込みなど、特定の操作によってトリガーされるように見える場合もあります。トリガーとなるCTDエラーの例はBlender 3Dで見つけることができます。ユーザーが編集モードのときに、Ctrl+Bを使用してエッジをベベルすることができます。ユーザーがフリーマウス操作中にCtrl+Zで元に戻す機能を使用すると、ソフトウェアがCTDエラーで終了する可能性が高くなります。
CTD(クラッシュ・トゥ・デスクトップ)バグは、ユーザーにとって特に厄介な問題です。エラーメッセージが表示されないことが多いため、問題の原因を特定するのは非常に困難です。特に、発生時刻やクラッシュ直前の操作にパターンや共通点が見られない場合はなおさらです。ゲームの問題の原因を特定する一つの方法は、ウィンドウモードで実行することです。一部のオペレーティングシステムには、CTD問題の原因特定に役立つツールが1つ以上搭載されている場合があります。
StepManiaやBBCのBamzookiなどの一部のコンピュータプログラムは、フルスクリーンで実行するとデスクトップにクラッシュしますが、ユーザーがデスクトップに戻ると、別のウィンドウにエラーが表示されます。
ウェブサイトの背後にあるウェブサーバーを稼働させているソフトウェアがクラッシュすると、ウェブサイトに全くアクセスできなくなったり、通常のコンテンツの代わりにエラーメッセージしか表示されなくなったりすることがあります。
例えば、ウェブサーバー自体はアクティブなままであっても、バックエンドデータベース(MySQLなど)のクラッシュによって依存関係の障害が発生し、サイトは要求されたページの代わりに500内部サーバーエラーを表示するようになる。


オペレーティングシステムのクラッシュは、処理できないハードウェア例外が発生した場合によく起こります。また、オペレーティングシステム内部の健全性チェックロジックが、オペレーティングシステムが内部的な自己整合性を失ったことを検出した場合にも、オペレーティングシステムのクラッシュが発生する可能性があります。
LinuxやmacOSなどの最新のマルチタスクオペレーティングシステムは、アプリケーションプログラムがクラッシュしても通常は影響を受けません。
z/OSなどの一部のオペレーティングシステムには、信頼性、可用性、保守性(RAS)のための機能が備わっており、ハードウェア障害(例えば、訂正不能なECCエラー)やソフトウェア障害(例えば、未割り当てページへの参照)など、重要なコンポーネントのクラッシュからOSが復旧することができます。
異常終了(ABEND)とは、ソフトウェアの異常終了、またはプログラムのクラッシュのことです。Novell NetWare ネットワークオペレーティングシステムで発生するエラーやクラッシュは、通常ABEND と呼ばれます。インターネット上には、abend.orgのようなNetWare管理者のコミュニティが数多く存在します。
この用法は、IBM OS/360、...、z/OSオペレーティング システムのABENDマクロに由来します。通常は大文字で表記されますが、「abend」と表記される場合もあります。一般的な ABEND コードには、System ABEND 0C7 (データ例外) と System ABEND 0CB (ゼロ除算) があります。[ 1 ] [ 2 ] [ 3 ] Abend は、「ソフト」(自動回復が可能) または「ハード」(アクティビティを終了) のいずれかになります。[ 4 ]この用語は、ドイツ語で「夕方」を意味する「 Abend 」に由来すると冗談めかして言われています。[ 5 ]
アプリケーションによっては、クラッシュにユーザーの機密情報や個人情報が含まれる場合があります。[ 6 ]さらに、クラッシュを引き起こす多くのソフトウェアバグは、任意のコード実行やその他の種類の権限昇格にも悪用可能です。[ 7 ] [ 8 ]例えば、スタックバッファオーバーフローは、サブルーチンの戻りアドレスを無効な値で上書きし、サブルーチンが戻るときにセグメンテーション違反などを引き起こします。しかし、エクスプロイトが戻りアドレスを有効な値で上書きした場合、そのアドレス内のコードが実行されます。
効果的なクラッシュ再現はデバッグにおいて非常に重要です。なぜなら、断続的または複雑な障害を予測可能で再現性のあるシナリオに変換することで、症状に対処するのではなく、根本原因を的確に調査し解決することが可能になるからです。
クラッシュが、例えばストレージダンプ、トレース、クラッシュレポーターなどを使用して現場で収集された場合、開発者にとって次のステップは、それらをローカルで再現できるようにすることです。自動クラッシュ再現技術は、一般的に 2 つのカテゴリに分類されます。記録再生アプローチは、実行をキャプチャして記録されたクラッシュを再生できることが多いものの、実行時のパフォーマンスに大きなオーバーヘッドを追加します。障害後処理アプローチは、クラッシュが発生した後にのみクラッシュを分析し、そのオーバーヘッドを回避します。[ 9 ]このためには、いくつかの技術が存在します。STAR はシンボリック実行を使用し、[ 9 ] EvoCrash は進化的探索を実行します。[ 10 ]