我在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 回答
这是GDB中的一个错误 . 它设置了一个临时断点并期望它被击中 . 但是断点没有被击中(可能是因为它设置在错误的位置),并且GDB的内部状态机让所有人感到困惑 .
您可以尝试从CVS升级到top-of-trunk GDB版本,如果GDB仍然坏了,请报告GDB中的错误bugzilla .
这是一个有点老的帖子 . 我仍然相信有人可以从中受益 .
我遇到了同样的问题 . 在我的例子中,该过程是多线程的 . 而且我碰巧注意到达到断点的线程已停止,其他线程正在执行:
在发出'bt'命令时它显示'Target is executing.'一旦我移动到线程2(通过发出'thread 2')并发出bt,我就能看到我的呼叫追踪 . 如果您想进行更多信息测试,或者您想进行一些实验,我建议"set scheduler-locking"可能会有所帮助 . 有关此模式的详细信息,请访问:https://sourceware.org/gdb/onlinedocs/gdb/All_002dStop-Mode.html
步骤命令警告:
如果使用step命令,而控制是在没有调试信息的情况下编译的函数内,则执行将继续执行,直到控制到达具有调试信息的函数 . 同样,它不会进入没有调试信息编译的函数 .
此外,如果存在该功能的行号信息,则步骤命令仅进入功能 . 否则它就像下一个命令 .
例如,当您想通过while循环调试过程以在指定的行停止它时
它在单核CPU计算机中工作正常,但它可能会产生“目标正在执行”的消息 . 使用GDB与多核CPU计算机时 .
所以解决方案是使用shell命令taskset来避免这个问题,例如,