【问题标题】:How to restrict gdb debugging to one thread at a time如何一次将 gdb 调试限制为一个线程
【发布时间】:2011-10-07 00:11:42
【问题描述】:

我想通过控制哪些线程何时执行来调试多线程程序。我正在使用 C++ 和 gdb。除了主线程(用于示例程序)之外,我还有两个线程,我想调试一个线程,同时保持另一个线程停止。

这是我写的示例程序:

#include <iostream>
#include <pthread.h>
#include <stdlib.h>

#define NUM_THREADS 2

using namespace std;

void * run (void *) {
  for (int i = 0; i < 3; ++i) {
    sleep(1);
    cout << i << " " << pthread_self() << endl;
  }
  pthread_exit(NULL);
}

int main (int argc, char** argv) {
  cout << "Start..." << endl;
  int rc;

  pthread_t threads[NUM_THREADS];
  for (int i = 0; i < NUM_THREADS; ++i) {
    rc = pthread_create(&threads[i], NULL, run, NULL);
    if (rc) {
      cout << "pthread_create returned error: " << rc << endl;
      exit(-1);
    }
  }
  pthread_exit(NULL);

}

我运行 gdb 并在sleep(1) 处设置断点。然后我运行程序。我得到三个线程(线程 2 和 3 是 pthreads),程序位于线程 2(在sleep(1) 等待)。现在,我想将线程 3 保留在任何位置,并继续单步执行线程 2(通过在 gdb 中执行 c)。

我尝试过的是set scheduler-locking on,但它似乎没有像我预期的那样工作。我在线程 2,我 set scheduler-locking oncontinue 几次(到目前为止一切顺利,我仍在线程 2),切换到线程 3,set scheduler-locking oncontinue,由于某种原因,我我回到线程 2 ......当我不应该的时候(根据我的理解)。有什么我想念的吗?

【问题讨论】:

    标签: gdb pthreads


    【解决方案1】:

    正如 TazMainiac 所说,调度程序锁定对于单步执行很有用,但“模式”必须设置为“步进”。

    set scheduler-locking step
    

    您可以参考 TazMainiac 提供的链接,其中提到了相同的内容:

    http://ftp.gnu.org/old-gnu/Manuals/gdb-5.1.1/html_node/gdb_39.html

    步进模式针对单步进行了优化。它停止其他线程 通过抢占当前线程来“抓住提示” 正在踩踏。

    【讨论】:

    • 在我的环境中看起来像 set scheduler-locking on 工作,但 set scheduler-locking 步骤不起作用。我正在使用 GNU gdb (GDB) SUSE (7.1-3.12)
    【解决方案2】:

    看起来调度程序锁定仅在您单步或下一步时有用。一旦您继续当前线程,它们都会运行,并且下一个遇到断点的线程将获取提示。至少,这是我对手册的解释:

    http://ftp.gnu.org/old-gnu/Manuals/gdb-5.1.1/html_node/gdb_39.html

    所以,一旦你进入线程 3,其他线程就会停止,只要你 step/next,它们就不会运行。但是,一旦您继续,它们都会运行,并且下一个线程(在您的示例中为 2)在 sleep(1) 中遇到断点将获取提示。

    也许让所有线程都进入睡眠状态,然后一次只继续其中一个。

    【讨论】:

    • 感谢链接...事实证明,即使我在线程 3 中 set scheduler-locking on 之后 next,它仍然将控制权转移回线程 2。(如果我 @987654324 则不会@,但是单步执行库代码中的每条指令非常痛苦。)除了 set scheduler-locking on 之外,还有其他命令可以解决问题吗?
    • 似乎没有更好的方法,你澄清了这个问题。所以,接受这个答案。
    • 使用set scheduler-locking on 据说是依赖于操作系统的。似乎在我的系统上运行良好(Linux 4.4.0 内核,gdb 7.11.1,Ubuntu 16.04)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多