我正在使用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行的断点,程序可以在此行正确停止 .
有没有遇到过这个?问题出在哪里?我该如何解决这个问题?
谢谢 .
1 回答
首先,禁用优化 . 它们可能导致编译器交换某些行,或者如果您错误地创建了未运行的代码,则会省略整个部分,例如:
默认的优化级别是-O2,调试的最佳选项是-Og . 尝试寻找并改变它们 .