我是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次执行中。我很困惑,怎么会发生这种情况?有人可以帮帮我吗?谢谢!
答案 0 :(得分:0)
在调试优化代码时,您描述的症状符合预期的症状。确保在没有-O2
或类似标志的情况下进行编译,或者在编译命令的末尾添加-O0
。
多线程不太可能与您的问题有任何关系(尽管在单步执行时它确实存在挑战)。 IF 多线程正在影响您的调试,当执行从一个线程切换到另一个线程时,您应该在GDB中看到消息,例如[Switching to Thread 0x7ffff61ec700 (LWP 21427)]
。