迭代堆栈帧是否安全?

时间:2015-07-16 18:38:38

标签: c stack-unwinding libunwind

my previous question中,我试图看看我是否可以通过编程方式从父级获取子进程的堆栈跟踪。

我已经成功地完成了这项任务,但现在我脑海中出现了另一个问题 - 在程序执行期间直接检查这些帧是否安全?我在这里定义“安全”,意思是“不会修改子堆栈上的值”。

例如,这是我从运行NPB-Serial CG A类基准测试中获得的样本堆栈跟踪:

0x400c7e : (conj_grad_+0x12e) [0x400c7e]
  Saved regs:
    RIP: 0x400c7e
    RSP: 0x7ffe5e3662a0
    RBP: 0x36b1
0x401ec8 : (MAIN__+0x739) [0x401ec8]
  Saved regs:
    RIP: 0x401ec8
    RSP: 0x7ffe5e366300
    RBP: (nil)
0x402b39 : (main+0x1d) [0x402b39]
  Saved regs:
    RIP: 0x402b39
    RSP: 0x7ffe5e368d40
    RBP: (nil)
0x7f76b7114ec5 : (__libc_start_main+0xf5) [0x7f76b7114ec5]
  Saved regs:
    RIP: 0x7f76b7114ec5
    RSP: 0x7ffe5e368d50
    RBP: (nil)
0x400a89 : (_start+0x29) [0x400a89]
  Saved regs:
    RIP: 0x400a89
    RSP: 0x7ffe5e368e10
    RBP: (nil)

我想通过复制每个堆栈指针条目的值来获取堆栈的转储 - 例如,从0x7ffe5e368e10开始并将该地址中的每个值复制到当前堆栈指针中位置。

这样做有风险吗?或者我是否错误地考虑了这个问题(例如,有一种更简单的方法可以做到这一点)?

0 个答案:

没有答案