繁体   English   中英

gdb步骤无法按预期工作

[英]gdb step not working as expected

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

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

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

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

您可以尝试从CVS升级到主干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”命令时,它确实显示“目标正在执行”。 一旦我移至线程2(通过发出“线程2”)并发出bt,就可以看到我的呼叫跟踪。 对于更多信息,或者如果您想做一些实验,我建议“设置调度程序锁定”可能会有所帮助。 有关此模式的详细信息,请访问: https//sourceware.org/gdb/onlinedocs/gdb/All_002dStop-Mode.html

步骤命令警告:

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

同样,仅当有功能的行号信息时,step命令才输入功能。 否则,它的作用类似于下一个命令。

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

int k = 1; while(k);

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

因此,解决方案使用的是shell命令任务集,例如,

taskset -c 1 you_program

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM