首页 文章

gdb步骤没有按预期工作

提问于
浏览
9

我在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 .

4 回答

  • 0

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

    这是GDB中的一个错误 . 它设置了一个临时断点并期望它被击中 . 但是断点没有被击中(可能是因为它设置在错误的位置),并且GDB的内部状态机让所有人感到困惑 .

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

    您可以尝试从CVS升级到top-of-trunk GDB版本,如果GDB仍然坏了,请报告GDB中的错误bugzilla .

  • 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'命令时它显示'Target is executing.'一旦我移动到线程2(通过发出'thread 2')并发出bt,我就能看到我的呼叫追踪 . 如果您想进行更多信息测试,或者您想进行一些实验,我建议"set scheduler-locking"可能会有所帮助 . 有关此模式的详细信息,请访问:https://sourceware.org/gdb/onlinedocs/gdb/All_002dStop-Mode.html

  • 12

    步骤命令警告:

    如果使用step命令,而控制是在没有调试信息的情况下编译的函数内,则执行将继续执行,直到控制到达具有调试信息的函数 . 同样,它不会进入没有调试信息编译的函数 .

    此外,如果存在该功能的行号信息,则步骤命令仅进入功能 . 否则它就像下一个命令 .

  • 2

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

    int k = 1; while(k);
    

    它在单核CPU计算机中工作正常,但它可能会产生“目标正在执行”的消息 . 使用GDB与多核CPU计算机时 .

    所以解决方案是使用shell命令taskset来避免这个问题,例如,

    taskset -c 1 you_program
    

相关问题