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
几次而不是step
, stepi
按预期工作。这种行为的原因是什么?除了使用stepi
之外,还有其他解决方案吗?我使用gdb 7.6和gcc 4.7.1
这种行为的原因是什么?
这是GDB中的一个bug。它设置一个临时断点,并期望它被击中。但是没有命中断点(可能是因为它设置在错误的位置),并且GDB的内部状态机都混淆了。
除了使用步骤外,还有其他解决方法吗?
您可以尝试从CVS升级到top-of-trunk 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'命令时,它确实显示'Target正在执行'。一旦我移动到线程2(通过发出'线程2')并发出一个bt,我就可以看到我的调用跟踪。要了解更多信息,或者如果您想做一些实验,我建议"set scheduler-locking"可能会有所帮助。此模式的详细信息请访问:https://sourceware.org/gdb/onlinedocs/gdb/All_002dStop-Mode.html
步骤命令警告:
如果在控件位于没有调试信息的编译函数内时使用step命令,则继续执行,直到控件到达具有调试信息的函数为止。同样,它也不会进入没有调试信息的编译函数。
同样,step命令只在函数有行号信息时才进入该函数。否则,它就像下一个命令。
当您想要通过while循环调试一个过程以在指定行停止它时,例如,
int k = 1; while(k);
它在单核CPU计算机上工作良好,但在多核CPU计算机上使用GDB时可能会产生"Target is execution ."消息。
所以解决方案是使用shell命令taskset可以避免这个问题,例如,taskset -c 1 you_program
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 当在带有Eigen的C++中使用GDB时,我如何才能看到更多的大矩阵
- 如何找出GDB的SIGTRAP核心转储的根本原因
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 我如何获得在Mac OS X上工作的GDB自制版
- GDB 记录还原未按预期工作
- 试图让 curl 在 c++ Linux 和 GDB 中工作
- CPP GDB 崩溃,没有核心和 GDB 附加到工作进程
- 山狮没有工作的 gdb 调试器
- Cygwin终端GDB列表功能不工作
- GDB步骤未按预期工作
- C/pp套接字,recv()/send()只在gdb下工作
- 基本的OpenGL程序崩溃,但与gdb一起工作