如何在交互式调试期间突出显示和着色 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模式,当你运行fframe时它不再显示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 默认为Altf)。顺便说一句,它在我的终端上不能正确显示颜色,而是像[?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】:

cgdbgdb -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 更改突出显示颜色

如何在文本突出显示期间保留语法突出显示

GDB 在远程调试期间挂起,库版本不匹配

Sublime Monokai 语法突出显示:如何为方法调用着色并使插值字符串内部的颜色不同

有没有办法在使用 sdiff 时着色高光差异?