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

How do I attach gdbserver to a process at startup?

本文关键字:进程 gdbserver 启动      更新时间:2023-10-16

我正在使用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,编译二进制文件并将其放置在目标机器上。我正在寻找比这更好,更简单的方法。

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

如果您对远程系统具有管理员访问权限,我能想到的最简单方法是重命名原始可执行文件,并将其替换为与原始可执行文件类似的 shell 脚本,该脚本在gdbserver的控制下启动现在重命名的。

类似于(假定可执行/usr/bin/foo)在目标计算机上:

root:# cd /usr/bin
root:# mv foo foo_
root:# echo "#!/bin/shngdbserver /dev/com1 foo_ foo.txt" > foo
root:# chmod a+x foo

正如它在gdbserverman(1)页面中所说:

这告诉gdbserver使用 foo.txt 参数调试foo_,并且 通过/dev/com1与GDB通信。GDB服务器现在耐心等待主机GDB与它通信。


我可以想到的另一种方法根本不修改原始进程,可能是一个小程序,它监视/dev/proc目录中的更改,并在此类事件中将gdbserver与关联的 pid 附加。
虽然这是一种运气,但如果附上gdbserver,那么在这个过程已经安排到main()之前


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