如何将gdb调试一次限制为一个线程
我想通过控制何时执行哪些线程来调试多线程程序。我用C++和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 =
#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