Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将gdb调试一次限制为一个线程_Gdb_Pthreads - Fatal编程技术网

如何将gdb调试一次限制为一个线程

如何将gdb调试一次限制为一个线程,gdb,pthreads,Gdb,Pthreads,我想通过控制何时执行哪些线程来调试多线程程序。我用C++和gdB。除了主线程外,我还有两个线程(例如示例程序),我希望调试一个线程,同时停止另一个线程 下面是我编写的示例程序: #include <iostream> #include <pthread.h> #include <stdlib.h> #define NUM_THREADS 2 using namespace std; void * run (void *) { for (int i =

我想通过控制何时执行哪些线程来调试多线程程序。我用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);

}
#包括
#包括
#包括
#定义NUM_线程2
使用名称空间std;
void*运行(void*){
对于(int i=0;i<3;++i){
睡眠(1);

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

因此,一旦您进入线程3,其他线程就会停止,只要您执行step/next,它们就不会运行。但是一旦您继续,它们都会运行,下一个在睡眠(1)中到达断点的线程(在您的示例中为2)将抓住提示


可能让所有线程进入睡眠状态,但一次只能继续其中一个线程。

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

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

单步模式针对单步执行进行优化。它停止其他线程 通过抢占当前线程而“捕获提示” 你在走路


感谢链接…事实证明,即使在线程3中的
设置调度程序锁定后
下一步
,它仍然会将控制权转移回线程2。(如果我
执行步骤
,则不会,但单步执行库代码中的每一条指令是非常痛苦的。)除了
set scheduler locking on
之外,还有什么命令能起作用吗?似乎没有更好的方法,你已经澄清了这个问题。所以,接受这个答案。使用
set scheduler locking on
据说是依赖于操作系统的。不过在我的系统上似乎工作得很好(Linux 4.4.0内核,gdb 7.11.1,Ubuntu 16.04)在我的环境中,设置调度器锁定看起来很有效,但设置调度器锁定步骤不起作用。我使用的是GNU gdb(gdb)SUSE(7.1-3.12)
set scheduler-locking step