gdbのようにbacktrace
のような出力を得たいです。しかし、私はこれを直接ptrace()
経由でしたいと思います。私のプラットフォームはLinux、x86です。また、x86_64以降。ptrace(linux、x86/x86_64)のみを使って "バックトレース"(gdbのように)を得る方法
ここでは、シンボル名に変換せずに、スタックから返されたアドレスだけを読みたいと思っています。
ので、テストプログラムのために、gcc-4.5
によって-O0
モードでコンパイル:
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:はい、これもideaのbacktrace(3)
libc functionと非常によく似ていますが、私はこれを外部からptrace経由で行いたいと思います。
libunwindの外部解凍文書へのリンクを提供できますか? – osgx
これは? http://www.nongnu.org/libunwind/man/libunwind-ptrace(3).html - libunwind-ptraceでバックトレースを取得する例がいくつかありますか? – osgx
ドキュメントへのリンクを追加しました。いいえ:libunwind-ptraceはあなたが望むものではありません.ptrace機能を実装するlibunwindの一部です。その部分を使ってより高いレベルのlibunwindを再実装することができますが、そうする必要はありません。 –