11

我正在 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多次而不是step,stepi按预期工作。这种行为的原因可能是什么?除了使用还有什么解决方法stepi吗?我正在使用 gdb 7.6 和 gcc 4.7.1。

4

4 回答 4

14

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

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

除了使用 stepi 之外,还有其他解决方法吗?

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

于 2013-06-06T04:10:10.443 回答
3

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

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

  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

于 2016-03-27T07:38:36.847 回答
1

步进命令警告:

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

此外,step 命令仅在函数存在行号信息时才进入函数。否则它就像下一个命令一样。

于 2014-04-23T09:40:29.307 回答
0

例如,当您想通过 while 循环调试过程以将其停止在指定行时,

int k = 1; while(k);

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

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

taskset -c 1 you_program
于 2018-08-23T07:31:33.470 回答