gdb步骤没有按预期工作

时间:2013-06-03 15:41:28

标签: c++ linux gdb static-linking

我正在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。

4 个答案:

答案 0 :(得分:12)

  

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

这是GDB中的一个错误。它设置了一个临时断点并期望它被击中。但是断点没有被击中(可能是因为它设置在错误的位置),并且GDB的内部状态机让所有人感到困惑。

  

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

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

答案 1 :(得分: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,我就能看到我的通话跟踪。 对于更多信息或者如果您想进行一些实验,我建议“set scheduler-locking”可能会有所帮助。有关此模式的详细信息,请访问:https://sourceware.org/gdb/onlinedocs/gdb/All_002dStop-Mode.html

答案 2 :(得分:1)

步骤命令警告:

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

此外,如果有该功能的行号信息,则步骤命令仅进入功能。否则它就像下一个命令一样。

答案 3 :(得分:0)

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

int k = 1; while(k);

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

因此,解决方案使用的是shell命令任务集,例如,可以避免此问题,

taskset -c 1 you_program