【发布时间】:2017-04-01 15:57:10
【问题描述】:
我在 ARM9 平台上使用 gdb 和 gdbserver 进行远程调试。这两个程序都是在 Ubuntu 系统上编译的,gdbserver 使用交叉编译器编译。
一般来说,被调试的程序可以在设置的断点处停止。但是,使用next 或step 的单步执行大部分时间都有效,除了在代码的某些位置。特别是,我发现一直给我带来问题的是switch 块。例如。
1 inchar = getchar();
2
3 switch (inchar)
4 {
5 case 'a':
6 ....
7 break;
8 case 'b':
9 ....
10 break;
11 case 'c':
12 ....
13 break;
14 }
如果我在第 1 行设置断点,程序会在该行停止而不会出现问题。但是如果我随后使用next 或step,在点击第3 行之后,下一步不会导致程序在任何一种情况下停止。相反,它会继续运行,直到下一个断点被命中或直到我执行 ctrl-c。
但是,如果我在第 6 行(例如)放置断点,而在第 1 行没有断点,程序可以在该行正确停止。
有人遇到过吗?问题出在哪里?如何解决此问题?
谢谢。
【问题讨论】:
-
您是否有机会通过优化编译(
-Ox和x > 0)? -
^^^^^^^^ 我的第一个想法也是。您应该在尽可能关闭优化的情况下进行调试。使用 max opt,调试时会发生很多奇怪的事情:)
-
@alk 和 ThingyWotsit 即使在调试模式下也有可能开启优化。编译过程由脚本处理。我可以检查并再次返回。但是为什么优化会影响 gdb 的操作呢?
-
@alk 我在构建固件的调试版本时检查并关闭了优化。所以谜底仍然存在......
-
你试过
-Og吗? (详情在这里:gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html)