适用于gdb调试器的大多数棘手/有用的命令[关闭]


138

您可以在运行调试器(如gdb或dbx)时发布最棘手和最有用的命令吗?


Answers:


134
  1. backtrace full:使用局部变量完成回溯
  2. 框架:在框架之间移动
  3. 监视:在满足特定条件时暂停过程
  4. 设置打印漂亮:打印出格式化的C源代码
  5. 设置登录:记录调试会话以向其他人显示以获取支持
  6. 设置打印数组:漂亮的数组打印
  7. 完成:继续直到功能结束
  8. 启用禁用:启用/禁用断点
  9. tbreak:中断一次,然后删除断点
  10. 其中:当前正在执行的行号
  11. info locals:查看所有局部变量
  12. info args:查看所有函数参数
  13. 列表:查看源代码
  14. rbreak:中断匹配正则表达式的函数

7
info locals-查看所有局部变量;列表-查看源代码; rbreak-中断匹配正则表达式的函数。
Paul Biggar

源/ path / to / macro / file和我所有的漂亮宏都可以在几秒钟内帮助我调试。
Sudhanshu 2010年

1
set print object on用于多态元素,set print elements 0是我经常使用的两个命令。很有用。
Kiril Kirov 2014年

1
另外,t a a bt(意思是thread apply all backtrace)。可以与(几乎)所有其他命令一起使用。尤其有用bt full
基里尔·基洛夫


45

从gdb 7.0开始,存在可逆调试功能,因此您最喜欢的新命令是:

* 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.

21

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


3
Ctrl-a a切换回“普通”命令行视图!
凯文

2
“-”可用于'wh'。越短越好..::)
raj_gt1 2015年

6
Ctrl-a a?开玩笑吗 看起来更像tmux/ screencommand。而且对我不起作用。它必须是一个每个文档C-x C-aC-x aC-x A
x-yuri

实际上是C-x a。您还可以在ui模式下使用C-x 1和切换视图,C-x 2以查看装配(如果需要)。
山姆·惠特洛克(Shit Whitlock)

16

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


那是我很久以来一直在寻找的命令!一个接一个地检查所有30个线程真的很讨厌!
tothphu


6

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


您还可以使用该-iex选项在gdb命令行上添加单个命令。
doug65536 '17

5

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


1
如何设置调度程序锁定?
deft_code 2010年

3
set scheduler-locking onGDB里

如何将其设置为默认值?我尝试使用它。
Omry Yadan 2014年

4
  • 使用.gdbinit(启动文件,您可以在其中编写宏并从gdb调用)。将.gdbinit放在您的主目录中,以便每次加载gdb时都将其拾取
  • 信息线程以列出所有活动线程,以及要切换到的f(#)->#线程号

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

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

4

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


2
您可以使用将焦点更改到命令窗口,focus cmd以便使用上/下箭头。您可以使用切换回去focus src
内森·费尔曼

3

这可能很有用,但我相信可以改善,欢迎您:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.