Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法让gdb与另一个进程共享ptrace?_Gdb_Ptrace - Fatal编程技术网

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

有没有办法让gdb与另一个进程共享ptrace?,gdb,ptrace,Gdb,Ptrace,我需要运行另一个进程,该进程需要ptrace(),这是次进程。但gdb也需要将ptrace()设置为相同的次方,因此这将导致混乱。我想到的第一个也是显而易见的解决方案是,当另一个进程需要访问次进程时,分离gdb,然后再次连接,但是当次进程停止调试时,这也是有问题的。然后,我尝试使用gdb的shell命令从gdb启动另一个进程,我认为如果gdb作为子进程执行另一个进程,它可能会工作,但即使gdb作为子进程执行,它们也会有不同的pid,所以问题仍然存在 有没有可能使gdb和其他进程看起来像是共享同一

我需要运行另一个进程,该进程需要ptrace(),这是次进程。但gdb也需要将ptrace()设置为相同的次方,因此这将导致混乱。我想到的第一个也是显而易见的解决方案是,当另一个进程需要访问次进程时,分离gdb,然后再次连接,但是当次进程停止调试时,这也是有问题的。然后,我尝试使用gdb的
shell
命令从gdb启动另一个进程,我认为如果gdb作为子进程执行另一个进程,它可能会工作,但即使gdb作为子进程执行,它们也会有不同的pid,所以问题仍然存在


有没有可能使gdb和其他进程看起来像是共享同一个pid,这样它们就可以连接到同一个进程?抱歉,如果这是一个无趣的问题,我还是Linux新手。

不,没有办法做到这一点


您最好的选择是向gdb添加新代码以完成您想要的任务。

不,没有办法做到这一点

您最好的选择是向gdb添加新代码以完成您想要的任务。

解决方案1:不要使用ptrace 在最新版本的Linux(自3.2版起)中,一个进程可以读取/写入另一个进程内存,而无需先读取/写入它:

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

  • 或者使用新的系统调用

scanmem可以进行调整,以避免目标过程中的ptracing,并改用这些方法。由于scanmem仅使用
PTRACE\u ATTACH
PTRACE\u DETACH
PTRACE\u PEEKDATA
PTRACE\u POKEDATA
,因此应该可以简单地编写一个
PTRACE
版本

解决方案2:GDB服务器 总结:

[GDB] ----------> [ tracer ] ---> [ traced ]
      GDB protocol          ptrace
您有三个过程:

  • GDB过程

  • (其他)示踪过程

  • 跟踪过程

其思想是GDB不跟踪跟踪进程本身

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

这意味着跟踪器必须管理其ptrace操作,以便完成GDB工作和它自己的工作,这可能不是一项容易的任务

第二种解决方案过于复杂/过于复杂,无法实现您无法实现的目标。

解决方案1:不要使用ptrace 在最新版本的Linux(自3.2版起)中,一个进程可以读取/写入另一个进程内存,而无需先读取/写入它:

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

  • 或者使用新的系统调用

scanmem可以进行调整,以避免目标过程中的ptracing,并改用这些方法。由于scanmem仅使用
PTRACE\u ATTACH
PTRACE\u DETACH
PTRACE\u PEEKDATA
PTRACE\u POKEDATA
,因此应该可以简单地编写一个
PTRACE
版本

解决方案2:GDB服务器 总结:

[GDB] ----------> [ tracer ] ---> [ traced ]
      GDB protocol          ptrace
您有三个过程:

  • GDB过程

  • (其他)示踪过程

  • 跟踪过程

其思想是GDB不跟踪跟踪进程本身

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

这意味着跟踪器必须管理其ptrace操作,以便完成GDB工作和它自己的工作,这可能不是一项容易的任务


第二种解决方案过于复杂/过于复杂,无法实现。然而,这并非完全不可能。只是很难。可能比它的价值更难(即-比入侵gdb)。然而,这是为了让
strace
发挥作用

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


正如我上面所说的,这种方法绝不比破解gdb来做你想做的事情简单。

这并非完全不可能。只是很难。可能比它的价值更难(即-比入侵gdb)。然而,这是为了让
strace
发挥作用

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


正如我上面所说的,这种方法绝不比黑客攻击gdb来做你想做的事情简单。

Linux在同一个目标上调用
ptrace
的两个进程。你到底想完成什么?我想运行scanmem和gdb来进行一些基本的内存搜索。我还尝试使用gdb的
find
命令来完成这项工作,但是速度太慢了。你到底想完成什么?我想运行scanmem和gdb来进行一些基本的内存搜索。我也试着用gdb的
find
命令来做,但是速度太慢了