web-dev-qa-db-ja.com

.stackdumpファイルをどのように解釈できますか?

この質問はおそらく Cygwin実行可能ファイルからのスタックダンプを使用 -の繰り返しですが、私は初心者であり、答え、または質問の一部さえ理解していませんでした。

私はC++とプログラミングにかなり慣れておらず、NetBeansで開発しています。正常にコンパイルされるが、実行中に失敗するコードに取り組んでいます。デバッガーを使用すると、次のエラーが発生します。

1 [main] all 6200 exception::handle: Exception: STATUS_ACCESS_VIOLATION
881 [main] all 6200 open_stackdumpfile: Dumping stack trace to all.exe.stackdump

All.exe.stackdumpファイルを見つけることができ、notepad ++で読み取ることができますが、その意味がわかりません。このファイルをデコードするためのユーザーフレンドリーな方法があるという別の質問を集めましたが、私の最善の推測はbash$ gdb all.exe.stackdump効果がなかった。このファイルをデバッグに使用するための最良の方法は何ですか?

念のため、all.exe.stackdumpの内容を以下に示します。

Exception: STATUS_ACCESS_VIOLATION at eip=00434C41
eax=2003A2E4 ebx=0028A95C ecx=00000000 edx=0028A95C esi=0028A9B0 edi=00000000
ebp=0028A9C8 esp=0028A930 program=[redacted for privacy/security], pid 6200, thread main
cs=0023 ds=002B es=002B fs=0053 gs=002B ss=002B
Stack trace:
Frame     Function  Args
0028A9C8  00434C41  (00000000, 2003A4F0, 0028A9E8, 00000000)
0028A9E8  00436B14  (00000000, 2003A4F0, 0028AA28, 0028D000)
0028AAF8  004036A4  (0028AB80, 2003A2B0, 00000014, 00000003)
0028ABD8  00403FBC  (00000001, 0028AC00, 200280E8, 2003A189)
0028ACF8  61007535  (00000000, 0028CD78, 61006B20, 00000000)
End of stack trace
17
jlsecrest

これは多くの人に共通の問題です。そして通常、彼らはあなたにgdbを使うように言うでしょう。ただし、これは必ずしも合理的な答えではありません。新しいビルドがクラッシュしたものと同じシンボルアドレスを持つことが保証されていないため、再コンパイルしないでください。役立つツールがいくつかあります。objdump、addr2lineなどです。「objdump-D -S build.out> build.rasm.txt」を実行して、テキスト内でこれらの関数アドレスを検索できます。 Addr2lineは、これらの関数を識別するための良い選択でもあります。このようなクラッシュの問題を頻繁に処理する場合は、作業に役立つスクリプトツールを作成することをお勧めします。

幸運を。

7
Hao

「関数」アドレスをaddr2lineへの引数として使用できます。

addr2line -f -C -e main.exe 0xADD4355

すべてのアドレスでawkとpipeを使用してフィルタリングします。

awk '/^[0-9]/{print $2}' main.exe.stackdump | addr2line -f -C -e main.exe

関数名の代わりに??が表示されている場合は、デバッグシンボル(-g-ggdb3...)を使用して再構築する必要があります。

8
assem

問題のある行を見つける別の方法は、バイナリファイルでgdbを使用することです。したがって、最初にgdbを実行します:gdb main.exe

Gdbの実行内:info line *0xADD4355

0
djondal