我需要运行另一个需要ptrace()它的低级进程。但是gdb也需要ptrace()同样的劣势,所以这会导致混乱。我想到的第一个显而易见的解决方案是,每当其他进程需要访问下级然后再次附加时,分离gdb,但是当下级停止进行调试时,这也是有问题的。然后我尝试使用gdb' s shell
命令从gdb启动另一个进程,想想如果gdb像孩子一样执行其他进程,它可以工作,但即使gdb作为一个孩子执行它,他们会有不同的pid,所以问题仍然存在。
是否有可能使gdb和其他进程看起来像共享相同的pid所以它们可以附加到相同的下层?很抱歉,如果这是一个非常苛刻的问题,我还是Linux新手。
答案 0 :(得分:3)
不,没有办法做到这一点。
您最好的选择是向gdb添加新代码以执行您想要的操作。
答案 1 :(得分:1)
这并非完全不可能。非常非常非常困难。可能比它的价值更难(即 - 比黑客gdb)。但是,fakeroot-ng
允许strace
工作的是什么。
这个想法是,如果同时运行由同一个调试器跟踪的目标进程和 gdb,您可以模拟gdb完成的ptrace
调用,并自行执行。结果是gdb 认为它正在跟踪你的子进程,但实际上你是在实践中跟踪它的那个。
就像我上面所说的那样,这个apprach绝不比黑客攻击gdb更简单,只是做你想做的事。
答案 2 :(得分:0)
在Linux的最新版本(从3.2开始)中,一个进程可以读取/写入另一个进程内存,而无需先进行优先处理:
通过open/read/write
- ing /proc/$pid/mem
(在Linux 3.2之前,只有在目标进程停止时才可以读取此文件但是从Linux 3.2开始,您不需要停止目标过程);
PTRACE_ATTACH
,PTRACE_DETACH
,PTRACE_PEEKDATA
和PTRACE_POKEDATA
,因此应该可以简单地编写ptrace
- 更少的版本。
要点:
[GDB] ----------> [ tracer ] ---> [ traced ]
GDB protocol ptrace
您有三个流程:
GDB流程;
(其他)示踪程序;
追踪过程。
这个想法是GDB不会跟踪跟踪过程本身。
相反,您希望修改跟踪器,以便使用GDB protocol向GDB公开类似gdbserver的接口。 GDB不是跟踪跟踪的进程,而是连接到代表GDB可以在跟踪器上执行操作的跟踪器。
这意味着跟踪器必须管理其ptrace操作才能同时执行GDB内容和自己的内容,这可能不是一件容易的事。
然而,对于你无法实现的目标,第二种解决方案过于复杂/过度。