我正在使用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/