如何在启动时将 gdbserver 附加到进程?
How do I attach gdbserver to a process at startup?
我正在使用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
正如它在gdbserver
man(1)页面中所说:
这告诉gdbserver使用 foo.txt 参数调试foo_,并且 通过
/dev/com1
与GDB通信。GDB服务器现在耐心等待主机GDB与它通信。
我可以想到的另一种方法根本不修改原始进程,可能是一个小程序,它监视/dev/proc
目录中的更改,并在此类事件中将gdbserver
与关联的 pid 附加。
虽然这是一种运气,但如果附上gdbserver
,那么在这个过程已经安排到main()
之前
1无论如何,您都应该访问源代码,以便使用gdb
进行合理的调试。尽管在某些情况下,您也可以使用(取消)汇编代码。
- boost::进程间消息队列引发错误
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 是否可以通过C++扩展强制多个python进程共享同一内存
- IPC使用多个管道和分支进程来运行Python程序
- 异常属于C++中的线程还是进程
- WMI检测进程创建事件-c++
- c++多进程编写一个唯一的文件
- 如何在C++中将函数发送到另一个进程
- 在Qt Creator中,如何在连接到正在运行的进程后查看控制台输出
- 终止 QProcess 不会终止子进程
- 将返回值从 exe 传递到 bat,并将其传递给 C# 中的进程
- COM :是否可以查看是否存在对我的某个 COM 对象的进程外引用?我可以释放它吗?
- Windows 进程间同步类似事件?
- 在挂钩启动新线程时解除挂钩进程
- pclose() 不会给我进程退出代码
- 运行代码时,c++ 会终止进程
- 可以读入进程内存的最大块大小是多少?
- 枚举进程模块在有效句柄上返回无效句柄
- 如何在启动时将 gdbserver 附加到进程?
- GDB,连接到使用 GDBServer 启动的正在运行的进程