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

Is there a way to make gdb share ptrace with another process?

我需要 运行 另一个需要 ptrace() 的进程。但是 gdb 也需要 ptrace() 同样的劣势,所以这会导致混乱。

我想到的第一个也是最明显的解决方案是在其他进程需要访问劣质进程时分离 gdb,然后再次附加。但是,当下级停止调试时,这也是有问题的。

然后我尝试使用 gdb 的 shell 命令从 gdb 启动另一个进程,我想如果 gdb 将另一个进程作为其子进程执行,它可能会起作用。但是即使 gdb 作为子进程执行它,它们也会有不同的 PID,所以问题仍然存在。

是否可以使 gdb 和其他进程看起来共享相同的 PID,以便它们可以附加到相同的下级进程?

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

最好的办法是向 gdb 添加新代码来执行您想要的操作。

解决方案 1:不使用 ptrace

在 Linux 的最新版本中(自 3.2 起),一个进程可以 read/write 另一个进程内存而无需先跟踪它:

  • 通过 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-less 版本。

解决方案 2:GDB 服务器

总结:

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

你有三个进程:

  • GDB进程;

  • (其他)跟踪进程;

  • 跟踪过程。

这个想法是 GDB 不 ptrace 跟踪进程本身。

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

这意味着跟踪器必须管理它的 ptrace 操作,以便同时执行 GDB 和它自己的东西,这可能不是一件容易的事。

第二个解决方案太过complex/overkill但是你无法实现。

也不是完全不可能。只是非常非常非常困难。可能比它的价值更难(即 - 比破解 gdb)。然而,这是 fakeroot-ng 为了让 strace 工作而做的。

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

就像我上面说的,这个方法绝不比破解 gdb 来做你想做的事更简单。