【问题标题】:Most tricky/useful commands for gdb debugger [closed]gdb调试器最棘手/有用的命令[关闭]
【发布时间】:2010-12-01 01:41:00
【问题描述】:

您能否在运行 gdb 或 dbx 等调试器时发布您最棘手和最有用的命令。

【问题讨论】:

标签: c unix gdb debugging dbx


【解决方案1】:

从 gdb 7.0 开始,有 reversible debugging,所以你最喜欢的新命令是:

* reverse-continue ('rc') -- Continue program being debugged but run it in reverse
* reverse-finish -- Execute backward until just before the selected stack frame is called
* reverse-next ('rn') -- Step program backward, proceeding through subroutine calls.
* reverse-nexti ('rni') -- Step backward one instruction, but proceed through called subroutines.
* reverse-step ('rs') -- Step program backward until it reaches the beginning of a previous source line
* reverse-stepi -- Step backward exactly one instruction
* set exec-direction (forward/reverse) -- Set direction of execution.

【讨论】:

    【解决方案2】:

    在启动 gdb 时使用 -command=<file with gdb commands> 选项。与-x <command file> 相同。此命令文件可以包含 gdb 命令,如断点、选项等。在需要使用 gdb 进行连续调试运行的特定可执行文件的情况下很有用。

    【讨论】:

    • 您还可以使用-iex 选项在 gdb 命令行上添加单个命令。
    【解决方案3】:
    1. 完整的回溯:使用局部变量完成回溯
    2. :在帧间移动
    3. watch:满足某个条件时暂停进程
    4. set print pretty on:打印出格式精美的 C 源代码
    5. 设置日志记录:记录调试会话以显示给其他人以获得支持
    6. 设置打印数组:漂亮的数组打印
    7. 完成:继续到函数结束
    8. enabledisable:启用/禁用断点
    9. tbreak:中断一次,然后删除断点
    10. where:当前正在执行的行号
    11. info locals:查看所有局部变量
    12. info args:查看所有函数参数
    13. 列表:查看源代码
    14. rbreak:在函数匹配正则表达式时中断

    【讨论】:

    • info locals -- 查看所有局部变量;列表——查看源代码; rbreak -- 在函数匹配正则表达式时中断。
    • source /path/to/macro/file 我所有漂亮的宏都可以帮助我在几秒钟内完成调试。
    • set print object on 用于多态元素,set print elements 0 是我经常使用的两个命令。很有用。
    • 另外,t a a bt(意思是thread apply all backtrace)。可以与(几乎)所有其他命令一起使用。与bt full 一起使用特别有用。
    【解决方案4】:

    不要使用 -tui 选项启动 gdb 以查看包含突出显示程序中正在执行的代码行的屏幕的子进程,而是使用 C-x o 和 C-x a 跳入和跳出此功能。如果您正在使用该功能以及暂时不使用它的内容,这很有用,因此您可以使用向上箭头获取上一个命令。

    【讨论】:

    • 您可以使用focus cmd 将焦点更改到命令窗口,以便向上/向下箭头起作用。你使用focus src切换回来。
    【解决方案5】:

    要调试 STL,请将内容添加到 .gdbinit,请按照以下说明操作:

    http://www.yolinux.com/TUTORIALS/GDB-Commands.html#STLDEREF

    【讨论】:

      【解决方案6】:

      thread apply all btthread apply all print $pc:用于快速找出所有线程在做什么。

      【讨论】:

      • 这是我找了很久的命令! 30个线程一一检查真的很讨厌!
      【解决方案7】:

      这可能很有用,但我相信它可以改进,欢迎帮助:

      define mallocinfo
        set $__f = fopen("/dev/tty", "w")
        call malloc_info(0, $__f)
        call fclose($__f)
      

      【讨论】:

        【解决方案8】:
        • 使用 .gdbinit(启动文件,您可以在其中编写宏并从 gdb 调用)。将 .gdbinit 放在您的主目录中,以便每次加载 gdb 时都会将其拾取
        • info threads列出所有活动线程,f(#) -> #你想切换到的线程号

        • 有时我使用 gdb 将十六进制转换为十进制或二进制,它非常方便,而不是打开计算器

          • p/d 0x10 -> 给出 0x10 的十进制等值
          • p/t 0x10 -> 二进制等价于 0x10
          • p/x 256 -> 相当于 256 的十六进制数

        【讨论】:

          【解决方案9】:

          脚本 gdb 是一个很好的技巧,除了我喜欢 设置调度程序锁定开/关,以防止在您介入时运行其他线程。

          【讨论】:

          • 如何设置调度程序锁定?
          • set scheduler-locking on 在 gdb 中
          • 如何将其设为默认值?我试过 .gdbinit 但 gdb 打印 /home/omry/.gdbinit:1: Error in sourced command file: Target 'None' cannot support this command.
          【解决方案10】:

          除了使用“-tui”参数启动 GDB,您还可以在使用一段时间后通过键入“wh”切换到文本模式。

          【讨论】:

          • Ctrl-a a 切换回“普通”命令行视图!
          • "-' ​​可以用来代替 'wh'。越短越好..:)
          • Ctrl-a a?是笑话吗?看起来更像tmux/screen 命令。而且对我不起作用。它必须是 asdocs 之一:C-x C-aC-x aC-x A
          • 其实是C-x a。您还可以在 tui 模式下使用 C-x 1C-x 2 切换视图以查看程序集(如果需要)。
          【解决方案11】:

          使用文本用户界面启动 gdb

          gdb -tui
          

          【讨论】:

          • 我不敢相信这个功能这么多年都逃过了我的视线。谢谢,谢谢,谢谢!
          • 谢谢你节省了我很多时间.. Wonderfull....
          • 还有另一个: RET
          • 或使用cgdb
          • 非常好的功能。到目前为止错过了这个......
          【解决方案12】:

          例如stl-views.gdb中定义的宏

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-02-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-05-23
            • 2011-10-24
            • 2011-10-01
            • 1970-01-01
            相关资源
            最近更新 更多