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