スレッドプロセスを備えたGDB癖
-
09-10-2019 - |
質問
GDBの複数のスレッドを使用してプロセスをデバッグしています。唯一のソースファイルをコンパイルしました -g
国旗。ただし、GDBで実行中に、次のシナリオが発生します。
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb7fe2b70 (LWP 2604)]
0x00000011 in ?? ()
スイッチの前に、特定のスレッドは sleep(5);
GDBがコードが「SegFaulted」を識別する点を特定できないのはなぜですか?
解決
0x00000011は有効なアドレスではなく、特にコード用ではありません。これは、0x00000011にコード(したがって機能がない)がないことを示しています。そして、これはあなたのスタックが破損していることを教えてくれます。 「動作」スタックがなければ、GDBは、デフォルトで呼び出しを記録せず、したがってスタックのみに依存しているため、スレッドがどこにあるかを理解できません。
編集x86では、Codeのようなコードで説明したように、同様の動作になることに注意してください
_start:
mov eax,0x11
jmp eax
これにより、コードがないため、デバッグシンボルもありません。これは、私の例のようなケースで発生する可能性がありますが、スタックがオーバーライドされている(破損)し、戻ってくるジャンプが無効なアドレスにつながる場合(0x11など)
所属していません StackOverflow