GDB步骤未按预期工作

gdb step not working as expected

本文关键字:工作 GDB      更新时间:2023-10-16

我正在调试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

这种行为的原因是什么?

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

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

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

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

我遇到了同样的问题。在我的例子中,这个过程是多线程的。我碰巧注意到遇到断点的线程被停止了,其他线程正在执行:

  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'命令时,它确实显示'Target正在执行'。一旦我移动到线程2(通过发出'线程2')并发出一个bt,我就可以看到我的调用跟踪。要了解更多信息,或者如果您想做一些实验,我建议"set scheduler-locking"可能会有所帮助。此模式的详细信息请访问:https://sourceware.org/gdb/onlinedocs/gdb/All_002dStop-Mode.html

步骤命令警告:

如果在控件位于没有调试信息的编译函数内时使用step命令,则继续执行,直到控件到达具有调试信息的函数为止。同样,它也不会进入没有调试信息的编译函数。

同样,step命令只在函数有行号信息时才进入该函数。否则,它就像下一个命令。

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

int k = 1; while(k);

它在单核CPU计算机上工作良好,但在多核CPU计算机上使用GDB时可能会产生"Target is execution ."消息。

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