2009-06-01 3 views
7

pdbを使用して、リリースモードで例外が発生した行をデバッガ(またはCLR例外ハンドラ)で表示することはできますか?リリースモードでpdbから行番号を取得する

リリースモードのコードは最適化されており、必ずしも「元の」コードの順序とロジックに従うとは限りません。

リリースモードであっても、デバッガが自分のコードをステップバイステップでナビゲートできることは驚くべきことです。最適化はナビゲーションを非常に不快にするはずです。

私はこれらの2点を明確にしてください。

答えて

10

私はこれがCLRでどのように行われているかに精通していませんが、おそらくネイティブコードでどのように行われたかに非常に似ています。コンパイラがマシン命令を生成すると、基本的に "現在のアドレスXの命令がfoo.cppの25行目から来た"というエントリをpdbに追加します。

デバッガは、現在実行中のプログラムアドレスを知っています。そこで、pdb内のいくつかのアドレスXを探し、それがfoo.cppの25行目から来ていることを確認します。これを使用すると、ソースコードを「ステップ」することができます。

このプロセスは、デバッグモードまたはリリースモード(リリースモードではpdbがまったく生成されない場合)に関係なく同じです。しかし、リリースモードでは、デバッガが最適化のためにコードを「線形的に」実行しないことがよくあります。予期せずに別の行にジャンプする可能性があります。これは、オプティマイザが命令の順序を変更するためですが、アドレスからソース行へのマッピングは変更されないため、デバッガは引き続きその命令に従うことができます。

+0

Tyです。物事は私のために今明らかです。 –

0

デバッガーは、問題が発生した場所でベストエフォートの推測を行います。 100%正確であることは保証されておらず、完全に最適化されたコードでは、不正確になることがよくあります。

デバッガが最適化されたコードの精度は、実際にコード自体とどの最適化を行っているかによって異なります。

+1

Ty。 "が完全に間違った呼び出しスタックを持つことになります。 スタックトレースは常に正確ではありませんか? –

+0

回線番号の発信元または詳細情報がありますか?私はデバッグ/ pdb /コンパイラのコード最適化でSOのいくつかの記事を赤字にしましたが、これについて明確な点は見つけられませんでした。詳細な回答は – gerleim

1

[@Not確かに]それはほとんど権利を有します。 コンパイラは、現在のマシンコード命令によく似た適切な行番号を特定するのに最善の努力をしています。

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

これに関係なく、デバッガは本質的にPDBマップ内のエントリを現在のIP(命令ポインタ)に最も近い(「前または等しい」)と見出し、その行を強調表示します。

時にはマッチはあまり良くありません。そのとき、ハイライト表示された領域がその場所全体に飛び散っているのが見えます。

+1

おそらく、コンパイラはリリース用とデバッグモード用に異なるpdbを生成します。リリースモード用のpdbは最適化を考慮しているため、例外に対して比較的正確な行を与えることができます。 –

+0

ああ、絶対に。 PDBは、それが構築されたのと同じ正確なDLL(またはEXE)のインスタンスに永遠に結び付けられています。ソースファイルを変更せずに同じモードで再コンパイルしても、PDBとDLLを混在させて一致させることはできません。あなたのPDBは、コンパイラがランダムに各ビルドの異なる場所に物を置く可能性があるため、デバッグするモジュール(DLLまたはEXE)がコンパイルされたときに作成されたのと同じものでなければなりません。それはあなたがやろうとしていたことでしたか? –

+0

@Euro Micelli:>コンパイラがランダムに各ビルド上の異なる場所にものを置くかもしれません<それは私には災害のためのレシピが好きです。私は実際にそのような事を見たことがない。これは、Microsoftのツールを使用した場合にのみ発生します。または.NET?私が経験したすべての事例において、コンパイラは常に与えられた入力から正確に同じビット単位の結果を生成します。他のものは非常に疑わしい(あなたは "再現不可能なビルド"と言うことができますか?) –

関連する問題