質問

それは例外がPDBを使用してリリースモードで起こった行を表示するデバッガ(またはCLR例外ハンドラ)は可能ですか?

コードは、リリースモードでは、最適化されており、常に「オリジナル」のコードの順序とロジックに従っていません。

これは、デバッガでもリリースモードでは、ステップによって私のコードのステップをナビゲートできるようにしても驚きです。最適化は、ナビゲーションが非常にinconfortable確認する必要があります。

あなたは私のために、これらの2点を明確にしてくださいもらえますか?

役に立ちましたか?

解決

私は、これはCLRで行われているかのように慣れていないんだけど、それはおそらく、それがネイティブコードで行うのかと非常によく似ています。コンパイラは機械語命令を生成するとき、それは基本的に言うPDBにエントリを追加し、「現在のアドレスの命令を、Xは、foo.cppにライン25から来ました」。

デバッガは、現在実行されているもののプログラムのアドレスを知っています。だから、PDBに、いくつかのアドレス、Xを検索し、それがfoo.cppにライン25から来たことを見ています。これを使用すると、それはあなたのソースコードを「ステップ」ことができるのです。

このプロセスに関係なく、デバッグまたはリリースモードと同じである(PDBがリリースモードでは全く生成されることを条件とします)。あなたは、多くの場合、リリースモードでの最適化によりに、デバッガがコードを「直線的」段階ではないということ、しかし、正しいです。これは、予想外に異なるラインに飛び回ることがあります。これは、命令の順序を変更し、オプティマイザによるものであるが、それはアドレスとソース線マッピングを変更しないので、デバッガはまだそれに従ってくださいすることができます。

他のヒント

[わからない@]それはほとんど権利を有します。 のコンパイラは、は密接に現在のマシンコード命令に合致する適切な行番号を特定するに最善の努力を行います。

PDBとデバッガが最適化については何も知りません。 PDBファイルは、基本的に、ソースコードの行番号にマシンコードでアドレス位置をマッピングします。最適化されたコードでは、ソースコードの特定の行に正確にアセンブリ命令を一致させることは常に可能ではありませんので、コンパイラは、PDBにそれが手元に持っている最も近いものを書きます。これは、「ソースコードの前の行」、または「外側のコンテキストのソースコード行(ループなど)」、または何か他のものかもしれません。

にかかわらず、デバッガは、本質的に、現在のIP(命令ポインタ)への(「前又は等しい」のように)最も近いPDBマップ内のエントリを見つけ、そのラインを強調している。

たまに試合は非常に良いではない、とあなたはあらゆる場所にジャンプ強調表示された領域を見るときです。

デバッガは、問題が発生した場所でのベストエフォート型の推測になります。 100%正確であることが保証されておらず、完全に最適化されたコードと、それはしばしば不正確になります - 私はどこにもオフに数行から完全に間違ったコールスタックを持つまでの誤りを発見しました。

デバッガは、どのように正確に本当に最適化されたコードであるコード自体に依存し、あなたが作っている最適化されます。

以下のSOの質問を参照します:

スタック内の

表示ライン数リリースモードでの.NETアセンブリ

のためのトレース
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top