C GDB远程调试不';不要在某些时候停下来

C GDB远程调试不';不要在某些时候停下来,c,debugging,gdb,gdbserver,C,Debugging,Gdb,Gdbserver,我正在ARM9平台上使用gdb和gdbserver进行远程调试。这两个程序都是在Ubuntu系统上编译的,gdbserver使用交叉编译器编译 通常,正在调试的程序能够在设置的断点处停止。但是,使用next或step的单步执行大部分时间都有效,但代码的某些位置除外。特别是,我发现一直给我带来问题的是switch块。例如 1 inchar = getchar(); 2 3 switch (inchar) 4 { 5 case 'a': 6 ..

我正在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行设置断点,程序将在这一行停止,不会出现问题。但是,如果在点击第3行后,我随后使用了
next
step
,则下一步不会导致程序在这两种情况下停止。相反,它将继续运行,直到命中下一个断点或执行ctrl-c操作为止

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

有人遇到过这种情况吗?问题出在哪里?我如何纠正这种行为


谢谢。

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

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

优化的默认级别是-O2,调试的最佳选项是-Og。试着找到并改变这些

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

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

优化的默认级别是-O2,调试的最佳选项是-Og。试着找到并改变这些

您是否有机会使用优化(
-Ox
使用
x>0
)进行编译?我的第一个想法也是。您应该在尽可能多地关闭优化的情况下进行调试。使用max opt,调试时会出现很多奇怪的情况:)@alk和thingywot即使在调试模式下也有可能打开优化功能。编译过程由脚本处理。我可以查一下再回来。但是为什么优化会影响gdb的操作呢?@alk我已经检查过了,在构建固件的调试版本时,优化被关闭了。所以谜团依然存在……你试过
-Og
?(此处详细信息:)您是否有机会使用优化(
-Ox
使用
x>0
)进行编译?^^^^^^^^我的第一个想法也是如此。您应该在尽可能多地关闭优化的情况下进行调试。使用max opt,调试时会出现很多奇怪的情况:)@alk和thingywot即使在调试模式下也有可能打开优化功能。编译过程由脚本处理。我可以查一下再回来。但是为什么优化会影响gdb的操作呢?@alk我已经检查过了,在构建固件的调试版本时,优化被关闭了。所以谜团依然存在……你试过
-Og
?(详情如下:)