我正在使用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
以退出循环。但这要求我们能够访问源代码,编译二进制文件并将其放在目标机器上。我正在寻找比这更好,更简单的方法。
答案 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-)汇编代码。