我正在使用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退出循环。但这要求我们能够访问源代码,编译二进制文件并将其放置在目标计算机上。我正在寻找一种比这更好,更轻松的方法。

最佳答案



看起来您正在使用linux / unix之类的远程操作系统。

如果您具有对远程系统的管理员访问权限,那么我想到的最简单的方法是重命名原始可执行文件,然后将其替换为一个名为原始可执行文件的shell脚本,该脚本会在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

就像gdbserver man(1) page中所说:




我可以想到的另一种方法是根本不修改原始过程,它可以是一个监视/dev/proc目录中的更改的小程序,并在此类事件中将gdbserver与关联的pid附加在一起。
运气不错,但是,如果附加了gdbserver,则该进程之前已经调度到main()了。

1无论如何,您都应该访问源代码,以便使用gdb进行合理的调试。尽管在某些情况下,您也可以只使用(反汇编)代码。

关于c++ - 如何在启动时将gdbserver附加到进程?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45116818/

10-11 16:07