使用GDB

时间:2016-05-13 13:16:51

标签: c multithreading debugging emacs gdb

首次尝试使用pthreads创建多线程应用程序

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

试图确定我或gdb是否有错误

情景:

  1. 主线程创建子线程。
  2. 我在子线程fn
  3. 的一行上放置一个断点
  4. gdb在该断点上停止没问题
  5. 我确认现在有2个帖子info threads
  6. 我还检查第二个主题是否已加星标,即它是gdb目的的当前主题
  7. 这是问题,当我现在点击n以进入线程fn中的下一行时,父线程(线程1)只是恢复并完成并且gdb退出。
  8. 这是正确的行为吗?

    如何逐行执行第二个线程中正在执行的线程fn代码?{/ 1}?

    换句话说,即使线程2被gdb确认为当前线程,当我点击gdb时,它似乎相当于在父线程中点击n ,即父线程(线程1)只恢复执行,完成并退出。

    关于如何使用c调试多个线程而不知道当前的行为

    我在emacs25中使用gdb,即gdb

2 个答案:

答案 0 :(得分:2)

GDB的功能取决于您的设置以及您的系统(某些供应商会修补此区域)。

通常情况下,在全停模式下,当下级停止时,GDB会停止所有线程。这为您提供了“期望”的行为 - 您可以在线程之间自由切换,并查看每个线程中发生的情况。

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

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

这里的默认模式是continue,基本上是replay,除非使用记录和重放模式。但是,Fedora GDB的默认值为off;我不确定是否有其他发行版,但你可能想检查一下。

答案 1 :(得分:1)

是的,这是gdb的正确行为。您只调试当前活动的线程,其他线程正在幕后执行。考虑一下,你怎么会移动其他的东西呢?

但是你的代码有一个错误。在子线程完成之前,您的父线程不应退出。执行此操作的最佳方法是在退出之前在主线程中连接子线程。