在我之前的问题中,我试图查看是否可以以编程方式从其父进程获取子进程的堆栈跟踪。
我已经成功地做到了,但现在另一个问题出现在我的脑海中——在程序执行期间直接检查这些帧是否安全?我在这里将“安全”定义为“不会修改孩子堆栈上的值”。
例如,这是我从运行 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
从该地址开始并将每个值复制到当前堆栈指针到一个单独的位置。
这样做有什么风险吗?或者我是否错误地考虑了这一点(例如,有一种更简单的方法可以做到这一点)?