我已经加载了一个带有c ++程序进程的GDB会话。我想将它转移到具有不同接口的同一台机器上的另一个GDB会话,以便于调试。是否可以在不继续运行的情况下分离该进程,以便我可以将其附加到其他GDB会话中?
答案 0 :(得分:0)
是否可以在不继续运行的情况下分离流程 我可以在其他GDB会话中附加它吗?
我喜欢你的问题,但让我建议一种易于使用的替代方法。
只要附加调试器,一个简单的函数(如下所示)就可以保存任何线程。此外,您可以使用-D选项设置parkFlag以进行制作和条件编辑,并根据您的喜好默认设置。
bool parkFlag = true;
void park()
{
while(parkFlag) // pause thread for some time
std::this_thread::sleep_for (std::chrono::milliseconds(100));
}
因此,对于“更方便”的调试会话,请在main之后调用park。
现在启动'更方便'的调试器,附加,设置一些断点,然后清除parkFlag。
答案 1 :(得分:0)
是否可以在没有继续运行的情况下分离该进程,以便我可以将其附加到其他GDB会话中?
您可以(gdb) signal SIGSTOP
停止当前进程,但GDB会自动恢复detach
命令的进程。
可能有效的不是detach
过程,而是使用kill -9
杀死GDB本身。即便如此,当内核不再是ptrace
d时,内核可能会决定恢复该过程。
答案 2 :(得分:0)
GDB会话由程序在debug
下生成
我对你的程序如何产生gdb会话知之甚少。 但您可以尝试在测试运行之前创建别名(第6行)。
1 dmn@C5:~$ which gdb
2 /usr/local/bin/gdb
3 dmn@C5:~$ which ddd
4 /usr/bin/ddd
5 dmn@C5:~$
6 dmn@C5:~$ alias gdb='ddd'
7 dmn@C5:~$
8 dmn@C5:~$ which gdb
9 /usr/local/bin/gdb
10 dmn@C5:~$ which ddd
11 /usr/bin/ddd
12 dmn@C5:~$
13 dmn@C5:~$ gdb
14 dmn@C5:~$ ---command to start your program---
在我的ubuntu系统上,第13行调用别名。
从我的嵌入式系统背景中,我们可以查看可执行的二进制文件,以及我们找到的任何字符串(例如' gdb')我们可以将其编辑为其他内容(可能是' ddd&# 39)。
不推荐它,因为有更多适当的补丁'方法......但你只是试着想法可以别名'重定向'一个产卵'。
也许这就是“你如何修补现有的可执行文件?' (即没有重建它。