2016-05-13 59 views
1

1日的突袭多线程应用程序步入使用并行线程创建多线程aplication通过与GDB

我尝试使用gdb调试,但得到一些奇怪的意外行为

试图确定其是否我还是GDB在故障

场景:

  1. 主线程创建一个子线程。
  2. 我把一个断点的子线程线FN
  3. GDB停在该断点没有问题
  4. 我肯定现在有2个线程与info threads
  5. 我也检查了第二个线程出演,即它是gdb s目的的当前线程
  6. 这里是问题所在,当我现在点击n来逐步执行线程fn中的下一行时,父线程(线程1)简单地恢复并完成并退出gdb。

这是正确的行为?

如何在第二个线程中逐行执行正在执行的线程fn代码gdb

换句话说,即使线程2由gdb确认为当前线程,当我打n,这似乎是击中c在父线程,即父线程的当量(线程1)刚刚恢复执行,完成和退出。

处于亏损至于如何调试多线程与gdb表现为它是目前

我用gdb从emacs25内,即M-x gud-gdb

+0

如果你有谷歌,有关于多线程调试的信息。 –

回答

1

是的,这是GDB的正确行为。您只是在调试当前活动的线程,其他线程在幕后正常执行。考虑一下,你会如何移动其他的三叉戟?

但是你的代码有一个bug。子线程完成之前,您的父线程不应该退出。最好的方法是在退出之前在主线程中加入子线程。

+0

好的,所以如果父线程在子线程完成之前没有退出,我应该能够逐行通过子线程? – bph

+0

@ bph,是的。你会。 – SergeyA

+0

伟大 - 这非常有帮助 - 我仍然试图跨越执行范式转变的单线程到多线程。没有获得所需的心智模式,但..现在谷歌如何加入线程现在.. – bph

2

GDB在这里做什么取决于您的设置以及您的系统(某些供应商打补丁)。

通常,在全停止模式下,当劣势停止时,GDB停止所有线程。这给了你“期待”的行为 - 你可以在线程之间自由切换,看看每个线程正在发生什么。

当劣势继续时,包括通过nextstep,GDB允许所有线程运行。所以,如果你的第二个线程不以任何方式与你的第一个线程交互(没有锁等),你可能会看到它退出。

但是,您可以使用set scheduler-locking来控制此操作。将其设置为on将使得只有当前线程可以恢复。并且,将它设置为step将使得只有当前线程可以通过step(或者我认为next)恢复,但是会让所有线程在continue等上自由运行。

这里的默认模式是replay,基本上是off,除了使用记录和重放模式时。但是,Fedora GDB默认为step;我不确定是否有其他发行版跟在此之后,但您可能需要检查。

+0

是的,我现在可以看到这种行为是有道理的。我会给那个调度程序 - 锁定一个尝试,听起来很有用 – bph

+0

哇 - 它的工作原理! – bph

+0

哦!我不知道'设置调度程序锁定'! – SergeyA