プライベートシンボルがロードされますが、行番号は表示されませんか?
-
20-09-2019 - |
質問
私は、マネージコード(C#、任意のCPU用に構築されたコンソールアプリケーション)からクラッシュダンプをロードするためのWindbgを使用していますし、クラッシュダンプは、x64プラットフォーム上で作成されています。私は、x64プラットフォーム上でデバッグしています。
私は自分のアプリケーションのプライベートなシンボルをロードするには、次のコマンドを使用しています。ここで私はWindbgのに使用していますどのようなコマンドです。
(set symbol path and copy FooService.pdb pdb file to local symbol path D:\Debug)
0:016> .reload /f
.*** WARNING: Unable to verify checksum for FooService.exe
DBGHELP: FooService.pdb- private symbols & lines
D:\Debug\FooService.pdb
0:016> lm
start end module name
00000000`00400000 00000000`0041c000 FooService C (private pdb symbols) D:\Debug\FooService.pdb
次のコマンドを使用している場合、私の混乱は、行番号情報は、スタックトレースに示さなかったです。すべてのアイデアは、何が間違っているのですか?私はソースパスを設定する必要がありますか?
0:016> ~6 e!clrstack
EDIT 1:!の!私は例外がスローされたスタックトレースを見つけるために、PEとUを使用していくつかの問題に会った。
。ここに私のデバッグプロセスです。最初は私が使用!私はコードをdiassembleする!Uを使用する場合、例外オブジェクトのスタックトレースを印刷するPE。私が見つける問題がある!UはFooService.ProcessOrders()のすべての機能コードをdiassembleだろう、と私は、関数FooService.ProcessOrdersにクラッシュが発生した場所を正確な場所を見つけたいです。 Iは、diassembled注釈付きILコードのみ(例えば、A = A * 2ため、唯一のアセンブリ言語が示されている非関数呼び出しのC#コードのために、)私が作った関数呼び出しが含まれ、また見つける正確ILは、C#コードの各行にマッピングされていません、( 1)正しい予想される動作ということでしょうか? (2)溶液またはさらなる提案が私の分析はここに掲載の正確なC#コードを失敗した見つけることは何ですか?
!pe 0000064280155325
StackTrace (generated):
SP IP Function
000000001A56DA70 00000642B74E3B7A System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(System.Data.Common.DbAsyncResult, System.String, Boolean)
000000001A56DB10 00000642B74E3FCC System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
000000001A56DB90 0000064280155325 FooService.ProcessOrders()
000000001A56F3E0 0000064280153A21 FooService.RountineJob()
!U 0000064280155325
は、事前に感謝し、 ジョージ
解決
のWinDbg / SOSは!clrstack
の出力に行番号をマッピングしません。だから、限りlm
はあなたのセットアップ独自のアセンブリのためのプライベートPDBシンボルを持っていることを示していますように正しいです。 UnfortuntatelyのWinDbg / SOSの現在のバージョンは、ネイティブコードと同様に延びる同様に、ソースレベルデバッグをサポートしていません。
EDIT:例外について。あなたが!pe
を行うと、それはあなたに関連するメソッドへのコールスタックと同様にオフセットを教えてくれます。あなたは!pe
出力のIP欄からアドレスを取得し、その上!U
を行う場合は、該当するメソッドのためにJITコンパイルされたコードが表示されます。 IPの欄には、(あなたが正しい命令を見つけるために、少しの計数をしなければならない)例外を生成したコードの最後のアドレスになります。
分解出力は、.NETコールで注釈されています。それはあなたが探している文を投げた正確に識別するのに役立つはずです。
あなたは小さなメソッドの数にメソッドを分割する場合は、言われていること、あなたは非常に簡単にデバッグを行います。あなたがそれを行う場合は、メソッド名は、通常、例外の位置を特定するのに十分です。私は常にオプションではありません実現が、それは検討する価値があります。