2

私はCLRについて読み始め、ランタイム例外がどのようにスローされるのか疑問に思いました。

構文エラーが発生し、プログラムをビルドしようとすると、コンパイラーがそれを検出してエラーをスローします。この場合、ILはコンパイラによって生成されません(作成されないと思います。明確にしてください)が、ランタイムエラー(ゼロ除算やnullへの参照など)の可能性がある場合、コンパイラはこれを検出できず、ILを生成します。 。

プログラムの実行中、JITはこのILを使用して、マシンコードを生成します。これで、マシンコードがゼロ除算のあるステップを実行すると、例外がスローされます。

このような例外がある場合は、この例外が発生した行を示すビジュアルスタジオに表示されます。これはどのように行われますか?

私の質問が明確であることを願っています。

4

2 に答える 2

1

基本的に、コードを実行しているとき、実行は行ごとに行われます。ゼロで割ったような例外が発生すると、タイプのオブジェクトException classが作成されます。例外をキャッチするために例外処理を使用していて、次のように書くとします。

catch (Exception ex)   
{  
    MessageBox.Show(ex.Message);  
}

発生した例外のオブジェクト参照は変数にコピーされex(上記の場合)、プログラムは終了せず、例外を適切に処理すればさらに先に進むことができます。

したがって、基本的にはException class object、エラーに関する情報を含む例外生成コードの行の近くに作成され、この参照を catch ブロックにコピーして処理します。

例外処理がない場合try, catch()、プログラムは終了し、技術的なメッセージが表示されます。

明確なアイデアについては、これをご覧ください: http://msdn.microsoft.com/en-us/library/5b2yeyab.aspx

于 2012-08-27T06:43:02.657 に答える
1

Visual Studio は、その命令のマシン コードの場所とソース コードの場所の間のマッピングを含む PDB ファイルを作成します。

何らかの条件をチェックして例外をスローするコードを書くのと同じように、実行時例外の場合、条件は jit によって生成され、機械語ではエラーをチェックして例外をスローします。したがって、すべての除算操作の前に、ランタイムによってゼロ チェックが行われ、例外がスローされます。高度なテクノロジーを備えた最新の CPU を活用するために、これらは IL で明示的な命令として作成するのではなく、異なる方法で実装および実行されます。

そのような例外がある場合、clr は命令を PDB ファイルにマップし、ソース コードを返します。PDB を削除してコマンド ラインから実行すると、行番号情報は表示されません。デバッガーは、PDB と共に clr コードをロードし、すべてのマッピングを行うプログラムです。Visual Studio は行番号を取得してファイルを開きます。Visual Studio が表示するランタイム値を取得するために使用できる広範な Debugger API があります。

于 2012-08-27T06:59:37.280 に答える