有没有办法让gdb与另一个进程共享ptrace?

时间:2016-02-17 14:14:50

标签: gdb ptrace

我需要运行另一个需要ptrace()它的低级进程。但是gdb也需要ptrace()同样的劣势,所以这会导致混乱。我想到的第一个显而易见的解决方案是,每当其他进程需要访问下级然后再次附加时,分离gdb,但是当下级停止进行调试时,这也是有问题的。然后我尝试使用gdb' s shell命令从gdb启动另一个进程,想想如果gdb像孩子一样执行其他进程,它可以工作,但即使gdb作为一个孩子执行它,他们会有不同的pid,所以问题仍然存在。

是否有可能使gdb和其他进程看起来像共享相同的pid所以它们可以附加到相同的下层?很抱歉,如果这是一个非常苛刻的问题,我还是Linux新手。

3 个答案:

答案 0 :(得分:3)

不,没有办法做到这一点。

您最好的选择是向gdb添加新代码以执行您想要的操作。

答案 1 :(得分:1)

这并非完全不可能。非常非常非常困难。可能比它的价值更难(即 - 比黑客gdb)。但是,fakeroot-ng允许strace工作的是什么。

这个想法是,如果同时运行由同一个调试器跟踪的目标进程 gdb,您可以模拟gdb完成的ptrace调用,并自行执行。结果是gdb 认为它正在跟踪你的子进程,但实际上你是在实践中跟踪它的那个。

就像我上面所说的那样,这个apprach绝不比黑客攻击gdb更简单,只是做你想做的事。

答案 2 :(得分:0)

解决方案1:不要使用ptrace

在Linux的最新版本(从3.2开始)中,一个进程可以读取/写入另一个进程内存,而无需先进行优先处理:

  • 通过open/read/write - ing /proc/$pid/mem(在Linux 3.2之前,只有在目标进程停止时才可以读取此文件但是从Linux 3.2开始,您不需要停止目标过程);

  • 或使用新系统调用process_vm_readv() and process_vm_write()

可以调整scanmem以避免对目标进程进行调整并使用这些方法。由于scanmem仅使用PTRACE_ATTACHPTRACE_DETACHPTRACE_PEEKDATAPTRACE_POKEDATA,因此应该可以简单地编写ptrace - 更少的版本。

解决方案2:GDB服务器

要点:

[GDB] ----------> [ tracer ] ---> [ traced ]
      GDB protocol          ptrace

您有三个流程:

  • GDB流程;

  • (其他)示踪程序;

  • 追踪过程。

这个想法是GDB不会跟踪跟踪过程本身。

相反,您希望修改跟踪器,以便使用GDB protocol向GDB公开类似gdbserver的接口。 GDB不是跟踪跟踪的进程,而是连接到代表GDB可以在跟踪器上执行操作的跟踪器。

这意味着跟踪器必须管理其ptrace操作才能同时执行G​​DB内容和自己的内容,这可能不是一件容易的事。

然而,对于你无法实现的目标,第二种解决方案过于复杂/过度。