【问题标题】:GDB remote debugging doesn't stop at some pointsGDB 远程调试在某些时候不会停止
【发布时间】:2017-04-01 15:57:10
【问题描述】:

我在 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 行没有断点,程序可以在该行正确停止。

有人遇到过吗?问题出在哪里?如何解决此问题?

谢谢。

【问题讨论】:

  • 您是否有机会通过优化编译(-Oxx > 0)?
  • ^^^^^^^^ 我的第一个想法也是。您应该在尽可能关闭优化的情况下进行调试。使用 max opt,调试时会发生很多奇怪的事情:)
  • @alk 和 ThingyWotsit 即使在调试模式下也有可能开启优化。编译过程由脚本处理。我可以检查并再次返回。但是为什么优化会影响 gdb 的操作呢?
  • @alk 我在构建固件的调试版本时检查并关闭了优化。所以谜底仍然存在......
  • 你试过-Og吗? (详情在这里:gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

标签: c debugging gdb gdbserver


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2013-09-26
    • 2014-08-31
    • 2017-06-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2012-01-03
    • 2017-12-27
    • 2019-04-11
    相关资源
    最近更新 更多