1. ホーム
  2. c++

[解決済み] .stackdumpファイルはどのように解釈すればよいですか?

2022-02-03 14:39:31

質問事項

この質問は、おそらく次の質問の繰り返しです。 Cygwinの実行ファイルからstackdumpを使用する - とのことですが、初心者の私には答えどころか、質問の一部さえも理解できませんでした。

私は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

解決方法は?

これは多くの人にとって共通の問題で、通常、gdbを使うように言われます。しかし、これは必ずしも合理的な答えではありません。なぜなら、新しいビルドがクラッシュしたものと同じシンボルアドレスを持っていることは保証されていないからです。 objdumpやaddr2lineなど、役に立つツールはいくつかあります。 objdump -D -S build.out > build.rasm.txt" と実行すると、関数のアドレスをテキストから検索することができます。 また、Addr2lineもこれらの関数を特定するには良い方法です。 もし、このようなクラッシュ問題を頻繁に扱うのであれば、スクリプトツールを書いて作業を助けることをお勧めします。

頑張ってください。