当前位置: 首页 > 面试题库 >

如何仅使用ptrace(Linux,x86 / x86_64)获得“回溯”(如gdb)

刘德义
2023-03-14
问题内容

我想像backtracegdb一样获得类似输出。但是我想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?会有帧循环吗?我什么时候应该停止这种html" target="_blank">循环?

PS:是的,这在思想上也很像backtrace(3)libc函数,但是我想通过ptrace从外部进行。


问题答案:

osgx发布的示例仅适用于使用框架指针的代码。x86_64GCC产生的带有优化的代码没有。至少在某些处理器上,内核vdso代码x86未使用帧指针。GCC
4.6(具有优化功能)也不在x86模式下使用帧指针。

所有上述所有因素使“通过帧指针进行堆栈爬网”极其不可靠。

您可以使用libunwind(支持本地(进程内)和全局(通过ptrace进行进程外)展开)。

否则,您将不得不重新实现很大一部分libunwind

通过ptrace使用获取回溯的示例libunwind



 类似资料:
  • 问题内容: 在研究这个问题时,我遇到了一个使用的可能想法,但是我无法正确了解如何与线程交互。 假设我有一个给定的多线程主进程,并且我想附加到其中的特定线程(可能来自派生的子进程)。 我可以附加到特定线程吗?(有关此问题的手册有所不同。) 如果是这样,是否意味着单步执行仅一步步执行该线程的指令?它会停止所有进程的线程吗? 如果是这样,在我调用或时,其他所有线程是否仍保持停止状态?还是 所有 线程都继

  • 问题内容: 我正在使用find来查找目录中的所有文件,因此获得了路径列表。但是,我只需要文件名。即我得到,我想得到 问题答案: 在GNU中,您可以使用参数,例如:

  • 我正在寻找一些东西可以帮助我获得票证的id创建在第一行。 我知道我可以通过使用不同的准备好的查询来简化这一点,但我不想(试着看看这样做是否可行,是否不使用多查询方式)。 我知道mysql中的LAST_INSERT_ID(),但我有点担心同时插入几行.... 在我的研究过程中,我也看到有人直接选择指定的ID,但这是一个很大的资源成本。 我也看到@@插入,我没有看到他们之间有很大的区别,所以我也有同样

  • 这个问题是对此的后续/澄清: MOV x86指令是否实现了C 11memory_order_release原子存储? 这表明MOV汇编指令足以在x86上执行acquire release语义。我们不需要锁、Geofence或xchg等。然而,我很难理解这是如何工作的。 英特尔文件第3A卷第8章规定: https://software.intel.com/sites/default/files/ma

  • 问题内容: 我正在尝试获取%的总CPU使用率。首先,我首先要说“ top”根本不会做,因为cpu转储之间会有延迟,它需要2个转储和几秒钟的时间,这使我的程序挂起(我不想给它自己的线程) 我尝试的下一件事情是“ ps”,它是即时的,但总的总数总是很高(超过20),当我实际上让我的cpu做某事时,它保持在20左右… 还有其他方法可以获取总的CPU使用率吗?超过一秒还是更长的时间都没有关系……但是更长的

  • 为了概括这个问题,我借用了Zelenski CS课堂讲义中的材料。而且,这与我的具体问题有关,因为几年前我从另一位讲师那里学习了C语言的这种方法。讲义在这里。我对C的理解很低,因为我偶尔使用它。基本上,我需要编写一个程序的几次,我回到课堂材料,找到类似的东西,然后从那里开始。 在本例(第4页)中,Julie正在字符串函数中使用递归算法查找单词。为了减少递归调用的数量,她添加了一个决策点。 为了增加