c语言 - GDB 远程调试在某些点不会停止



我正在ARM9平台上使用gdb和gdbserver进行远程调试。这两个程序都是在 Ubuntu 系统上编译的,gdbserver 使用交叉编译器编译。

通常,调试中的程序能够在设置的断点处停止。但是,使用nextstep单步执行在大多数情况下都有效,但代码的某些位置除外。特别是,我发现一直给我带来问题的是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 行设置断点,程序将在此行停止而不会出现问题。但是如果我随后使用nextstep,在点击第 3 行后,下一步不会导致程序在这两种情况下停止。相反,它将继续运行,直到命中下一个断点或直到我执行 ctrl-c。

但是,如果我在第 6 行放置一个断点(例如),在第 1 行没有断点,程序可以在这一行正确停止。

有人遇到过这种情况吗?问题出在哪里?如何解决此行为?

谢谢。

首先,禁用优化。它们可能会导致编译器交换某些行,或者如果您错误地创建了未运行的代码,则省略整个部分,例如

bool condition = false;
xxx;
if (condition)
printf("this code will not run");

默认优化级别为 -O2,调试的最佳选项是 -Og。尝试查找并更改它们。

最新更新