GDB调试多线程,单线程的执行是不可预测的

时间:2014-10-26 13:04:24

标签: c++ multithreading gdb

我是GDB的新手并且不确定你是否有任何经验:当我使用GDB来调试具有2个线程的程序时,我发现逐行执行步进不是线性的或者它是&#39 ;即使对于一个单独的线程也是不可预测的,并且打印出的变量值也令人困惑。假设我有一个程序(在C ++中)看起来像这样:

(我在ubuntu命令行上调试,使用gdb的-tui模式)。

.....
    70 for (int i = 0; i < MAX; i++) {
    71     int foo = 1;
b+  72     Bar *bar = f1();
    73     int v1 = bar->doCalc();
    74     int v2 = bar->get(foo);
    75  }
.....

一开始,程序停在line 72,然后我逐行走,直到它到达line 74。此时,我打印出值v1,但似乎这个变量仍然没有有意义的价值。然后,如果我输入&#34; next&#34;,程序执行将再次跳回line 72!这是第一件引起我困惑的事情。然后我继续前进到下一行,直到它到达line 74。此时,我打印出v1,这次它有一些有意义的价值。我仔细检查了迭代器i,它的值是相同的,这意味着它在一个循环的第i次执行中。我很困惑,怎么会发生这种情况?有人可以帮帮我吗?谢谢!

1 个答案:

答案 0 :(得分:0)

在调试优化代码时,您描述的症状符合预期的症状。确保在没有-O2或类似标志的情况下进行编译,或者在编译命令的末尾添加-O0

多线程不太可能与您的问题有任何关系(尽管在单步执行时它确实存在挑战)。 IF 多线程正在影响您的调试,当执行从一个线程切换到另一个线程时,您应该在GDB中看到消息,例如[Switching to Thread 0x7ffff61ec700 (LWP 21427)]