交互式调试期间如何突出显示gdb输出并为其着色?


172

请不要回答,我应该使用ddd,nemiver,emacs,vim或任何其他前端,我只是更喜欢gdb,但希望看到带有某些终端颜色的输出。


4
它不会给你颜色(所以我不会称其为答案),但是某些〜/ .gdbinit配置将改善体验。我将其用作最低要求:设置历史记录保存在设置打印中漂亮的设置输出基数16设置高度0
activout.se

更改接受的答案会很好,因此可以删除我以前的错误答案。谢谢。
2014年

一旦突出显示当前行l并实现了sourceware.org/bugzilla/show_bug.cgi?id=21044,我将添加lhook-stop并输入Dev Nirvana。
Ciro Santilli郝海东冠状病六四事件法轮功

Answers:


183

.gdbinit

您可以调整~/.gdbinit颜色。您可以.gdbinit在此处使用mammon's :

https://github.com/gdbinit/gdbinit

您也可以根据需要进行任意调整。我发现这个要感谢这个SO答案。这是您可以获得的输出类型:

.gdbinit

GitHub存储库也可用:https : //github.com/gdbinit/Gdbinit

附带说明一下,同样的想法也适用于lldb

GDB资讯主页

遵循相同的概念,GDB仪表板为Python中的GDB提供了模块化的可视界面。

GDB资讯主页

(无效)沃克

另一个类似的项目使用GDB的Python支持来提供更多的可扩展性,因此值得一试:https : //github.com/dholm/voidwalker

@dholm还提供了自己的.gdbinit受前一个启发。

(无效)沃克

pwndbg

一些项目提供了一组有用的功能,包括改进的显示。PEDApwndbg就是这种情况。后者给出以下描述:

PEDA替代品。本着我们的好朋友的精神windbgpwndbg宣读pwnd-bag

  • 速度
  • 弹性
  • 干净的代码

它提供了类似于PEDA中的命令来支持调试和利用开发的命令,并可以更好地显示(尽管这不是项目的主要重点)。该软件仍在开发中,尚未正确发布。

pwndbg

沃尔创

项目的说明中指出:

Voltron是面向黑客的可扩展调试器UI。它使您可以将在其他终端上运行的实用程序视图附加到调试器(LLDB或GDB),显示有用的信息,例如反汇编,堆栈内容,寄存器值等,同时仍为您提供与以前相同的调试器CLI。

您可以修改.gdbinit以自动集成它。但是,显示本身在GDB之外(例如,在tmux分割中)。

沃尔创

全球环境基金

GEF是另一种选择,它描述为:

它旨在主要由开发人员和逆向工程人员使用,目的是使用Python API向GDB提供其他功能,以在动态分析和漏洞利用开发过程中提供帮助。

全球环境基金


非常感谢您的回答,您是否知道如何关闭寄存器输出?(我正在将gdb用于C ++代码,并且不需要立即使用汇编程序)
vak 2015年

是。该死的“注释的长度必须至少为15个字符。”
vak 2015年

1
@vak你尝试了set $SHOWCPUREGISTERS = 0吗?基本上,您可以设置几个参数,并且可以随时修改代码以适合您的需求。
BenC

100

它不是颜色,而是考虑gdb的文本gui。它对gdb的使用方式有很大的不同。

您可以使用以下命令启动它:

gdb -tui executable.out

屏幕截图:

在此处输入图片说明

如您所见,主要功能是:

  • 显示我们在源上的哪一行以及周围的行
  • 显示断点

5
哇!谢谢!我一直在寻找围绕gdb的漂亮图形外壳的很长时间,并且我尝试了xxgdb,kgdb和ddd,但是它们都不适合我,因此我坚持使用普通的旧命令行界面。但这绝对是完美的!
Thomas Padron-McCarthy

46
Ctrl-x Ctrl-a:输入此命令可在文本gui模式之间来回切换,即使没有命令行选项也可以使用。
jturcotte 2010年

2
从程序中打印到标准输出会中断我的界面。除了重定向以外,还有其他解决方法吗?
西罗Santilli郝海东冠状病六四事件法轮功

1
我在stdout中断接口时遇到了同样的问题。Ctrl-L或您的重绘绑定至少使它可用。对于启用了vi编辑模式的用户,Ctrl-X Ctrl-A不起作用,但是命令“ layout src”将使您进入TUI模式,并且源如图像所示。
wilywampa

1
打开第二个终端,然后发出命令:$ tty使用(gdb)set inferior-tty命令,将结果从gdb会话定向到该终端。例如 从我的.gdbinit设置的下级-tty / dev / tty2现在,您的标准输出不会弄乱$ gdb -tui。
netskink

46

我知道您不想要前端。但是cgdb与gdb非常接近,它是textmode,但上面有一个源代码窗口,其中的代码突出显示了语法。


2
sudo apt-get install cgdb
cs01

2
真正的偶然性:)
无知

只是尝试运行它:它看不到任何gdb历史记录,并且它还有一个搞砸的提示,在插入符号和要键入符号的实际位置之间有一些空格(这很可能是因为我在其中输入了彩色提示gdb。完全没有印象。
Hi-Angel

19

通过使用颜色,可以大大增强gdb的外观。这可以通过以下任何一种方法完成:

  1. 通过“设置提示”显示彩色提示。例如,使提示为粗体和红色:

    set prompt \033[1;31m(gdb) \033[m

    或将提示更改为新的形状(粗体和红色):

    set prompt \033[01;31m\n\n#####################################> \033[0m

    在此处输入图片说明

  2. 通过钩子着色命令

  3. “列表”命令的彩色语法突出显示。

所有示例均可在以下由Michael Kelleher撰写的博客文章中找到:

“美化GDB”,2010年5月12日(通过archive.org)

“实验性GDB语法突出显示”,2010年5月15日(通过archive.org)


14
链接断开。
约翰·卡特

7
@Mike:将这些链接的内容发布在此处很有用,因为该站点不再可用,并且robots.txt阻止archive.org为该站点编制索引。
Lucian Adrian Grijincu,2012年

1
您可以在此处获得相关信息:sourceware.org/gdb/current/onlinedocs/gdb/Prompt.html
musiphil 2013年

1
现在,这些链接指向博客文章的archive.org缓存。
Alex Quinn 2014年

1
@Mike,看来您是网志文章的作者;如果是这样,则应在答案中予以披露。
David Z

13

即将发布的GDB 8.3的新功能

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=blob;f=gdb/NEWS

终端样式现在可用于CLI和TUI。GNU Source Highlight还可以用来提供源代码片段的样式。有关更多信息,请参见下面的“设置样式”命令。

gdb 8.2.91.20190401-23.fc30的屏幕截图


有史以来最好的答案!您可以在此处找到有关如何安装gdb 8.3 medium.com/@simonconnah/…的教程,请注意您的计算机至少需要512MB的RAM,否则gcc编译器将开始报废。
用户

7
#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支持,“用户模式”破解。

这里找到主要部分 并对其进行了一些修改。需要突出显示,c ++ filt。如果颜色弄乱了,请重新发出命令。




4

我想强调如下:强调属于我的源文件(而不是库)的堆栈跟踪行。

解决方案是使用gdb-python(在MSYS上;在Linux上通常gdb已经内置Python吗?),hook backtrace,use

python stack_trace = gdb.execute('backtrace', False, True')

然后stack_trace使用Python的正则表达式处理并打印出来。粗体和其他颜色可通过以下功能实现:

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)

使用钩子的工作示例(即使最少)也可能会受到欢迎。
Hi-Angel


-2

您可以获得所需的任何颜色;

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