我正在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 行没有断点,程序可以在这一行正确停止。
有人遇到过这种情况吗?问题出在哪里?如何解决此行为?
谢谢。
首先,禁用优化。它们可能会导致编译器交换某些行,或者如果您错误地创建了未运行的代码,则省略整个部分,例如
bool condition = false;
xxx;
if (condition)
printf("this code will not run");
默认优化级别为 -O2,调试的最佳选项是 -Og。尝试查找并更改它们。