如何在启动时将gdbserver附加到进程?

时间:2017-07-15 09:49:38

标签: c++ debugging gdb remote-debugging gdbserver

我正在使用gdbserver来调试远程进程。我可以在启动后将gdbserver附加到进程并等待输入。

但是,我想在启动时将gdbserver附加到进程。该过程是通过shell脚本启动的,我无法更改此过程的启动方式,即我无法修改shell脚本以通过调用gdbserver来启动该过程。

如何在启动后立即将gdbserver附加到此进程?

编辑:我可以在main()的开头创建一个等待循环。例如,一个等待直到在预定位置找到文件的循环:

#include <unistd.h>
int main() {

    while( access("/home/username/CONTINUE", F_OK) == -1)
        sleep(1);

    /*
            ...all the rest of main()
     */

    return 0;
}

我们可以在进程忙于此循环时附加gdbserver,根据需要设置断点并说出touch /home/username/CONTINUE以退出循环。但这要求我们能够访问源代码,编译二进制文件并将其放在目标机器上。我正在寻找比这更好,更简单的方法。

1 个答案:

答案 0 :(得分:2)

  

但这要求我们能够访问源代码 1 ,编译二进制文件并将其放在目标机器上。我正在寻找比这更好,更简单的方法。

看起来你正在使用像远程操作系统这样的linux / unix。

如果您具有对远程系统的管理员访问权限,我能想到的最简单的方法是重命名原始可执行文件,并将其替换为名为原始可执行文件的shell脚本,该脚本在{{{{ 1}}。

目标机器上的(假设可执行文件gdbserver):

/usr/bin/foo

正如root:# cd /usr/bin root:# mv foo foo_ root:# echo "#!/bin/sh\ngdbserver /dev/com1 foo_ foo.txt" > foo root:# chmod a+x foo man(1) page中所述:

  
    

这告诉 gdbserver 使用foo.txt参数调试foo_,并且            通过gdbserver与GDB沟通。 gdbserver 现在耐心等待            主机GDB与之通信。

  

我根本无法修改原始进程的另一种方法可能是监视/dev/com1目录中的更改的小程序,并在此类事件中附加/dev/proc PID。
虽然它有点好运,但是如果附加了gdbserver,那么在此过程之前已经安排到gdbserver

1 无论如何,您都应该访问源代码,以便main()进行合理的调试。虽然有些情况下你也可以使用(dis-)汇编代码。