gpt4 book ai didi

linux - 如何仅使用 ptrace (linux, x86/x86_64) 获取 "backtrace"(如 gdb)

转载 作者:IT王子 更新时间:2023-10-29 01:06:19 27 4
gpt4 key购买 nike

我想像 gdb 一样得到类似 backtrace 的输出。但我想通过 ptrace() 直接执行此操作。我的平台是Linux,x86;以及后来的 x86_64。

现在我只想从堆栈中读取返回地址,而不转换为符号名称。

所以,对于测试程序,通过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 并等待信号。测试程序何时会进行 self 杀伤;信号将传送到我的程序。此刻我想读取返回地址,它们将像(因为 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 在外部执行此操作。

最佳答案

osgx 发布的示例仅适用于使用帧指针的代码。 x86_64 由 GCC 生成的经过优化的代码不会。 x86 上的内核 vdso 代码至少在某些处理器上不使用帧指针。 GCC 4.6(经过优化)也不在 x86 模式下使用帧指针。

以上所有因素结合起来使得“通过帧指针进行堆栈爬行”变得极其不可靠。

您可以使用 libunwind(它同时支持 local(进程内)和 global(通过 ptrace 的进程外)展开)。

或者您将不得不重新实现 libunwind 的很大一部分。

Example使用 libunwind 通过 ptrace 获取回溯。

关于linux - 如何仅使用 ptrace (linux, x86/x86_64) 获取 "backtrace"(如 gdb),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7258273/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com