backtrace
gdb のように出力を取得したい。ptrace()
しかし、私は直接これをやりたいです。私のプラットフォームは Linux、x86 です。そして、それ以降は x86_64 です。
ここで、シンボル名に変換せずに、スタックからリターン アドレスのみを読み取りたいと考えています。
したがって、テストプログラムの場合、次の-O0
モードでコンパイルされgcc-4.5
ます。
int g() {
kill(getpid(),SIGALRM);
}
int f() {
int a;
int b;
a = g();
b = a;
return a+b;
}
int e() {
int c;
c = f();
}
main() {
return e();
}
私は自分のプログラムを開始し、ptrace
最初にプログラムをテストするために接続します。次に、PTRACE_CONT を実行し、シグナルを待ちます。テスト プログラムが自己停止を行う場合。信号は私のプログラムに配信されます。この時点でリターン アドレスを読みたいと思いますが、次のようになります (kill
機能が現在アクティブであるため)。
0x00_some_address_in_g
0x00_some_address_in_f
0x00_some_address_in_e
0x00_some_address_in_main
0x00_some_address_in__libc_start_main
で現在停止しているテスト プロセスのリターン アドレスを見つけるにはどうすればよいptrace
ですか? フレームにループが発生しますか? そのようなループをいつ停止する必要がありますか?
PS: はい、これも考え方がbacktrace(3)
libc 関数に非常に似ていますが、ptrace を介して外部でこれを実行したいと考えています。