質問

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など)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top