是否可以在GDB会话之间转移程序控制?

时间:2016-06-22 20:50:08

标签: c++ gdb

我已经加载了一个带有c ++程序进程的GDB会话。我想将它转移到具有不同接口的同一台机器上的另一个GDB会话,以便于调试。是否可以在不继续运行的情况下分离该进程,以便我可以将其附加到其他GDB会话中?

3 个答案:

答案 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)。

不推荐它,因为有更多适当的补丁'方法......但你只是试着想法可以别名'重定向'一个产卵'。

也许这就是“你如何修补现有的可执行文件?' (即没有重建它。