我想獲得像gdb那樣的backtrace
樣輸出。但我想直接通過ptrace()
來做到這一點。我的平臺是Linux,x86;和更高版本的x86_64。如何僅使用ptrace(linux,x86/x86_64)獲得「backtrace」(如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:是的,這也非常喜歡backtrace(3)
libc function的想法,但我想通過ptrace在外部完成此操作。
您能否提供libunwind外部展開文檔的鏈接? – osgx
這個? http://www.nongnu.org/libunwind/man/libunwind-ptrace(3).html - 是否有一些使用libunwind-ptrace獲取回溯的示例? – osgx
我添加了文檔鏈接。否:libunwind-ptrace不是你想要的 - 它是libunwind的一部分,它實現了ptrace工具。您可以使用該部分來重新實現更高級別的libunwind,但應該沒有理由這樣做。 –