[英]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
而不是step
, stepi
可以正常工作。 这种行为的原因可能是什么? 除了使用stepi
之外,还有其他解决方法吗? 我正在使用gdb 7.6和gcc 4.7.1。
这个帖子有点老了。 我仍然相信会有人从中受益。
我遇到了同样的问题。 就我而言,该过程是多线程的。 而且我偶然发现到达断点的线程停止了,其他线程正在执行:
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.