【问题标题】:gdb step not working as expectedgdb 步骤未按预期工作
【发布时间】:2013-05-29 19:59:04
【问题描述】:

我正在 Linux 上调试静态多线程 x86-64 C++ 应用程序。

我可以在函数上设置断点并停止它们,我可以一步一步地遍历函数体。但是当我尝试进入另一个函数时,gdb 并没有在它的开始处停止,它似乎只是继续执行。当我中断程序执行时,gdb 进入损坏状态并变得无法使用:

(gdb) bt
Target is executing.
(gdb) c
Continuing.
Cannot execute this command while the selected thread is running.
(gdb) 

作为一种解决方法,我可以多次使用stepi 而不是stepstepi 按预期工作。 这种行为的原因可能是什么?除了使用stepi,还有什么变通方法吗? 我正在使用 gdb 7.6 和 gcc 4.7.1。

【问题讨论】:

  • 您是否使用-ggdb-O0 编译了目标?您是否尝试过观察 step (s) 和 next (n) 之间的区别?
  • @Reinderien,我的目标是用-g-O0 编译的。如何观察sn 之间的区别?
  • 尝试将其从 -g 更改为 -ggdb。要查看差异,请逐步在 gdb 中键入 s(实际上是“进入”)与 n(实际上是“跳过”)。
  • @Reinderien, n 按预期工作,我写道“我可以一步一步地走过函数体”,但 s (“step into”) 不行,这就是区别如果这就是你的意思。
  • 您需要发布您的代码。有线程调用吗?

标签: c++ linux gdb static-linking


【解决方案1】:

这种行为的原因可能是什么?

这是 GDB 中的一个错误。它设置一个临时断点并期望它被命中。但是断点没有被命中(可能是因为它设置在了错误的位置),GDB 的内部状态机都被搞糊涂了。

除了使用stepi还有什么变通方法吗?

您可以尝试从 CVS 升级到 top-of-trunk GDB 版本,如果 GDB 仍然损坏,请在 GDB bugzilla 中报告错误。

【讨论】:

【解决方案2】:

这是一个有点旧的帖子。我仍然相信有人可以从中受益。

我遇到了同样的问题。就我而言,该过程是多线程的。而且我碰巧注意到遇到断点的线程已经停止,其他线程正在执行:

  6 Thread 1000368545  (running)
  5 Thread 1000368389  (running)
  4 Thread 1000368388  (running)
  3 Thread 1000368387  (running)
  2 Thread 1000368386  myBreakPointFunction () at location/in/my/sourcefile.c:linenumber
* 1 Thread 1000367766  (running)

在发出“bt”命令时,它确实显示“目标正在执行”。 一旦我移动到线程 2(通过发出“线程 2”)并发出 bt,我就可以看到我的调用跟踪。 有关更多信息或如果您想做一些实验,我建议“设置调度程序锁定”可能会有所帮助。此模式的详细信息请访问:https://sourceware.org/gdb/onlinedocs/gdb/All_002dStop-Mode.html

【讨论】:

  • 为什么要显示线程列表而不是显示它的命令?
【解决方案3】:

步进命令警告:

如果您在控制位于没有调试信息的情况下编译的函数中使用 step 命令,则执行将继续进行,直到控制到达具有调试信息的函数为止。同样,它不会单步执行没有调试信息而编译的函数。

另外,step 命令只有在函数有行号信息的情况下才会进入函数。否则它就像下一个命令一样。

【讨论】:

    【解决方案4】:

    当你想通过while循环调试一个过程在指定行停止时,例如,

    int k = 1; while(k);
    

    它在单核 CPU 计算机上工作正常,但它可能会产生消息“目标正在执行”。在多核 CPU 计算机上使用 GDB 时。

    所以解决方案是使用shell命令taskset,可以避免这个问题,例如,

    taskset -c 1 you_program
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-29
      • 2019-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-04
      • 2019-04-07
      相关资源
      最近更新 更多