リテールビルドでコアダンプを分析するには、多くobjdump
の場合、特定のモジュールとソースを相互に関連付ける必要があります。通常、関数が非常に複雑な場合、アセンブリダンプをソースと関連付けるのは面倒です。assembly listing
今日、私は1つの特定のモジュール(コンパイルオプションを使用)を作成しようとしましたが-S
、アセンブリまたは何らかの相関関係を持つインターリーブソースが表示されることを期待していました。残念ながら、リストは相互に関連付けるのに十分なほど友好的ではなかったので、私は疑問に思っていました
- クラッシュの場所を特定できるコアダンプが与えられた
objdump
失敗したモジュールのアセンブリリストを再コンパイルして-S
オプション付きモジュール。
ソースと1対1で対応することは可能ですか?
例として、アセンブリリストは次のように表示されます。
.LBE7923:
.loc 2 4863 0
movq %rdi, %r14
movl %esi, %r12d
movl 696(%rsp), %r15d
movq 704(%rsp), %rbp
.LBB7924:
.loc 2 4880 0
testq %rdx, %rdx
je .L2680
.LVL2123:
testl %ecx, %ecx
jle .L2680
movslq %ecx,%rax
.loc 2 4882 0
testl %r15d, %r15d
.loc 2 4880 0
leaq (%rax,%rax,4), %rax
leaq -40(%rdx,%rax,8), %rdx
movq %rdx, 64(%rsp)
.LVL2123
しかし、のようなラベルとのようなディレクティブを解釈する方法を理解できませんでした.loc 2 4863 0
注
示されている回答のように、アセンブリソースを読み、シンボル(関数呼び出し、分岐、returnステートメントなど)に基づいてパターンを直感的に判断することが、私が一般的に行っていることです。私はそれが機能しないことを否定していませんが、関数がかなり関与している場合、アセンブリリストのページを読むのは苦痛であり、関数がインライン化されるかオプティマイザが単に投げられたために、ほとんど一致しないリストになってしまうことがよくあります好きなようにコード。どれだけ効率的に見えるかValgrind
最適化されたバイナリを処理し、Windows WinDBGで最適化されたバイナリを処理する方法について、私が見逃していることがあります。だから私はコンパイラの出力から始めて、それを使って相関させます。私のコンパイラがバイナリのマングリングを担当している場合、ソースとの相関方法を言うのが最善の人ですが、残念ながらそれはあまり役に立たず、.loc
本当に誤解を招く恐れがあります。残念ながら、私はさまざまなプラットフォーム間で再現不可能なダンプを読み通さなければならないことが多く、WinDBGを介したWindowsミニダンプのデバッグとLinuxコアダンプのデバッグに費やす時間が最も少なくなっています。私はそれが私が物事を正しくやっていないかもしれないけれども、私はこの質問を思いついた。