如何在交互式调试期间突出显示和着色 gdb 输出?
Posted
技术标签:
【中文标题】如何在交互式调试期间突出显示和着色 gdb 输出?【英文标题】:How to highlight and color gdb output during interactive debugging? 【发布时间】:2010-09-17 14:17:11 【问题描述】:请不要回复我应该使用 ddd、nemiver、emacs、vim 或任何其他前端,我只是更喜欢 gdb,但希望看到它的输出带有一些终端颜色。
【问题讨论】:
它不会给你颜色(所以我不会称之为答案),但一些 ~/.gdbinit 配置会改善体验。我将其用作最低限度: set history save on set print pretty set output-radix 16 set height 0 一旦在l
上突出显示当前行被实现 sourceware.org/bugzilla/show_bug.cgi?id=21044 ,我只需将 l
添加到 hook-stop
并进入 Dev Nirvana。
【参考方案1】:
即将推出的GDB 8.3 中的新功能!
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=blob;f=gdb/NEWS
终端样式现在可用于 CLI 和 TUI。 GNU 源代码 Highlight 还可用于提供源代码样式 sn-ps。有关详细信息,请参阅下面的“设置样式”命令。
【讨论】:
请注意您的机器至少需要 512MB 的 RAM,否则,gcc
编译器将开始崩溃。
注意:gdb 必须在编译时启用此功能。如果你碰巧在 Gentoo 上,像 echo 'sys-devel/gdb source-highlight' >> /etc/portage/package.use/my.use && emerge sys-devel/gdb
这样的东西是启用它重新编译所需要的。
注意:只有 source code 样式需要使用 source-highlight 编译,从 GDB 8.3 开始,界面的其余部分默认为彩色。另请注意since GDB 10.1,如果您安装了 Pygments Python 包,您将获得源代码突出显示。无需使用 source-highlight 编译 GDB!【参考方案2】:
通过使用颜色可以大大增强gdb的外观。这是通过以下任何一种方法完成的:
通过“设置提示”进行彩色提示。例如,使提示变为粗体和红色:
set prompt \033[1;31m(gdb) \033[m
或将提示设置为新形状,加粗和红色:
set prompt \033[01;31m\n\n#####################################> \033[0m
通过钩子着色的命令
“list”命令的彩色语法高亮显示。Michael Kelleher 撰写的以下博客文章中提供了所有示例:
"Beautify GDB", May 12, 2010 (via archive.org)
"Experimental GDB syntax highlighting", May 15, 2010 (via archive.org)
【讨论】:
@Mike:在此处发布这些链接的内容会很有用,因为该网站不再可访问,并且 robots.txt 阻止了 archive.org 对其编制索引。 您可以在这里获取相关信息:sourceware.org/gdb/current/onlinedocs/gdb/Prompt.html 链接现在指向博客帖子的 archive.org 缓存。 @Mike,看来您是博客文章的作者;如果是这样,您应该在答案中披露。 对于极简主义的答案,最好使用set prompt \1\033[1;31m\2(gdb) \1\033[m\2
否则提示上的行编辑将被破坏。【参考方案3】:
.gdbinit
您可以调整您的~/.gdbinit
以获得颜色。您可以使用 mammon 的 .gdbinit
,此处提供:
https://github.com/gdbinit/gdbinit
您也可以随意调整它。感谢this SO answer,我找到了这个。以下是您可以获得的输出类型:
GitHub 存储库也可用:https://github.com/gdbinit/Gdbinit
顺便说一句,applied to lldb 也有同样的想法。
GDB 仪表板
遵循相同的概念,GDB Dashboard 在 Python 中为 GDB 提供了模块化的可视化界面。
(void)步行者
另一个类似的项目使用 GDB 的 Python 支持来提供更多的可扩展性,因此值得一试:https://github.com/dholm/voidwalker
@dholm 还提供了他自己的 .gdbinit,灵感来自上一个。
pwndbg
一些项目提供了一组有用的功能,包括改进的显示。 PEDA 或 pwndbg 就是这种情况。后者给出如下描述:
PEDA 替代品。本着我们的好朋友
速度 弹性 清洁码windbg
的精神,pwndbg
发音为pwnd-bag
。
它提供了类似于 PEDA 的命令来支持调试和利用开发,以及更好的显示(尽管这不是项目的主要重点)。该软件仍在开发中,尚未正式发布。
伏特隆
project 描述指出:
Voltron 是面向黑客的可扩展调试器 UI。它允许您 将在其他终端中运行的实用程序视图附加到您的调试器(LLDB 或 GDB),显示有用的信息,例如反汇编、堆栈 内容、寄存器值等,同时仍为您提供相同的 你习惯的调试器 CLI。
您可以修改您的.gdbinit
以自动集成它。但是,显示本身在 GDB 之外(例如,在 tmux 拆分中)。
全球环境基金
GEF是另一种选择,描述为:
它的主要目的是供剥削者和逆向工程师使用,以 使用 Python API 向 GDB 提供附加功能以协助 在动态分析和漏洞利用开发过程中。
【讨论】:
非常感谢您的回答,您知道如何关闭寄存器输出吗? (我将 gdb 用于 C++ 代码,不需要汇编程序级别) @vak 你试过set $SHOWCPUREGISTERS = 0
吗?基本上你有several parameters that you can set,你可以随时修改代码以满足你的需要。
那个~/.gdbinit
文件打破了TUI模式,当你运行f
或frame
时它不再显示C或C++代码行:(。【参考方案4】:
this configuration 给出了另一种很好的颜色组合。它使检查回溯变得更加容易。要使用它,只需将该文件保存为~/.gdbinit
并正常运行gdb
【讨论】:
谢谢,这正是我想要的。我正在研究一个具有长调用堆栈的多线程应用程序,这非常适合那些回溯。【参考方案5】:这不是颜色,而是考虑 gdb 的text gui。它对 gdb 的可用性有很大的影响。
您可以使用以下命令启动它:
gdb -tui executable.out
截图:
如您所见,主要特点是:
显示我们在源的哪一行和周围的行 显示断点【讨论】:
哇!谢谢!我一直在寻找一个围绕 gdb 的漂亮图形 shell,我尝试过 xxgdb、kgdb 和 ddd,但它们都不适合我,所以我坚持使用普通的旧命令行界面。但这绝对是完美的! Ctrl-x Ctrl-a:输入这个来切换到文本 gui 模式,即使没有命令行选项也可以工作。 从程序打印到标准输出会破坏我的界面。除了重定向之外还有什么解决方法吗? 我遇到了同样的问题,标准输出破坏了界面。 Ctrl-L 或任何你的重绘绑定至少使它可用。对于启用 vi 编辑模式的人,Ctrl-X Ctrl-A 不起作用,但命令“layout src”将使您进入 TUI 模式,源如图所示。 打开第二个终端,然后发出命令: $ tty 使用 (gdb) set lower-tty 命令将结果从 gdb 会话定向到该终端。前任。从我的 .gdbinit 设置低级 tty /dev/tty2 现在你的标准输出不会搞砸 $gdb -tui.【参考方案6】:我知道你不想要前端。 但是cgdb 和gdb 很接近呢, 它是文本模式,但上面有一个源窗口,代码上有语法高亮显示。
【讨论】:
sudo apt-get install cgdb 刚刚尝试运行它:它没有看到任何 gdb 历史记录,而且它还有一个搞砸的提示,在插入符号和输入符号的实际位置之间有一些空格 (这可能是因为我有a colored prompt in gdb)。一点印象都没有。 @Hi-Angel 我猜 cgdb 没有使用 GNU Readline 或任何其他行编辑库。如果是这种情况,那么它不会有像样的提示。行编辑器提供的另一个强大功能是跳转到前一个单词(Readline 默认为Alt
f
)。顺便说一句,它在我的终端上不能正确显示颜色,而是像[?2004h
这样的垃圾。
根据GDB Wiki,cgdb 正在使用已弃用机制与 GDB 交互。
哦,关于终端输出垃圾是known issue not fixed。可惜维护者没有回复这个问题。【参考方案7】:
很好,我刚刚使用 colout 发现了这个 hack:https://github.com/nojhan/colout/blob/master/colout/example.gdbinit
【讨论】:
当我运行bt f
时它告诉我bash: colout: command not found
【参考方案8】:
我想强调如下:强调堆栈跟踪中属于我的源文件(而不是库)的行。
解决方案是使用 gdb-python(在 MSYS 上;在 Linux 上通常 gdb
已经内置了 Python?),挂钩 backtrace
,使用
python stack_trace = gdb.execute('backtrace', False, True')
然后用 Python 的正则表达式处理stack_trace
,并打印出来。粗体和其他颜色是通过这样的函数实现的:
def term_style(*v):
"""1 is bold, 30--37 are the 8 colours, but specifying bold may also
change the colour. 40--47 are background colours."""
return '\x1B['+';'.join(map(str, v))+'m'
#Use like this:
print term_style(1) + 'This will be bold' + term_style(0) #Reset.
print term_style(1,30) + 'This will be bold and coloured' + term_style(0)
print term_style(1,30,40) + 'Plus coloured background' + term_style(0)
【讨论】:
一个使用钩子的工作示例——即使是最小的——可能会更受欢迎。【参考方案9】:cgdb
比gdb -tui
好很多
【讨论】:
同意。我的程序打印的简单行破坏了 gdb -tui 的控制台。这在 cgdb 下不会发生。感谢您的提示!【参考方案10】:#into .gdbinit
shell mkfifo /tmp/colorPipe
define hook-disassemble
echo \n
shell cat /tmp/colorPipe | c++filt | highlight --syntax=asm -s darkness -Oxterm256 &
set logging redirect on
set logging on /tmp/colorPipe
end
define hookpost-disassemble
hookpost-list
end
define hook-list
echo \n
shell cat /tmp/colorPipe | c++filt | highlight --syntax=cpp -s darkness -Oxterm256 &
set logging redirect on
set logging on /tmp/colorPipe
end
define hookpost-list
set logging off
set logging redirect off
shell sleep 0.1s
end
define hook-quit
shell rm /tmp/colorPipe
end
define re
hookpost-disassemble
echo \033[0m
end
document re
Restore colorscheme
end
警告:越野车。不支持 TUI,“用户模式”破解。
找到主要部分here 并对其进行了一些修改。需要高亮,c++filt。如果颜色弄乱了发出重新命令。
【讨论】:
【参考方案11】:你可以得到任何你想要的颜色;
# gdb
(gdb) shell echo -en '\E[47;34m'"\033[1m"
...
anything is now blue foreground and white background
...
(gdb) shell tput sgr0
... back to normal
【讨论】:
以上是关于如何在交互式调试期间突出显示和着色 gdb 输出?的主要内容,如果未能解决你的问题,请参考以下文章
使用 ReSharper,如何在长时间运行的单元测试期间显示调试输出?
如何单击以使用 jQuery maphilight 更改突出显示颜色