20

この質問は、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 を見つけることができました。メモ帳 ++ を介して読み取ることができますが、その意味がわかりません。このファイルをデコードするユーザーフレンドリーな方法があるという別の質問を集めましたが、私の最善の推測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
4

3 に答える 3

10

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

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

awk を使用してフィルタリングし、すべてのアドレスにパイプします。

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

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

于 2014-11-23T15:03:06.180 に答える
8

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

幸運を。

于 2013-05-22T01:55:42.110 に答える
0

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

内部 gdb 実行: info line *0xADD4355

于 2016-10-21T20:08:53.293 に答える