10 个版本
0.1.11 | 2022年1月14日 |
---|---|
0.1.10 | 2021年6月3日 |
0.1.9 | 2020年11月14日 |
0.1.8 | 2020年7月15日 |
0.1.2 | 2019年3月31日 |
#264 在 调试
306 每月下载量
595KB
6K SLoC
ugdb
ugdb 是一个基于 unsegen 的,用于 gdb 的替代 TUI。
截图
这是什么?哦,是的。是的,您完全可以使用 ugdb
来调试 ugdb
调试 ugdb
。
构建
ugdb 使用 Rust 编写,需要安装 cargo 以进行构建。
$ git clone https://github.com/ftilde/ugdb
$ cd ugdb
$ cargo build --release
$ target/release/ugdb
安装
如果您是 Arch Linux 用户,则可以从 arch 用户仓库 安装 ugdb
yay -S ugdb
ugdb
也可以使用 crates.io 通过 cargo 安装
cargo install ugdb
用法
命令行界面旨在与 gdb 基本 兼容
$ ugdb --help
ugdb 0.1.11
ftilde <ftilde@REDACTED>
An alternative TUI for gdb
USAGE:
ugdb [FLAGS] [OPTIONS] [--] [program]...
FLAGS:
-h, --help Prints help information
--nh Do not execute commands from ~/.gdbinit.
-n, --nx Do not execute commands from any .gdbinit initialization files.
-q, --quiet "Quiet". Do not print the introductory and copyright messages. These messages are also suppressed
in batch mode.
--rr Start ugdb as an interface for rr. Trailing ugdb arguments will be passed to rr replay instead.
-V, --version Prints version information
OPTIONS:
-b <bps>
Set the line speed (baud rate or bits per second) of any serial interface used by GDB for remote debugging.
--cd <cd>
Run GDB using directory as its working directory, instead of the current directory.
-x, --command <command_file> Execute GDB commands from file.
-c, --core <core_file> Use file file as a core dump to examine.
--gdb <gdb_path> Path to alternative gdb binary. [default: gdb]
-e, --initial-expression <initial_expression_table_entries>... Define initial entries for the expression table.
--layout <layout>
Define the initial tui layout via a format string. [default: (1s-1c)|(1e-1t)]
--log_dir <log_dir>
Directory in which the log file will be stored. [default: /tmp]
-p, --pid <proc_id> Attach to process with given id.
--rr-path <rr_path> Path to alternative rr binary. [default: rr]
-d, --directory <source_dir>
Add directory to the path to search for source files.
-s, --symbols <symbol_file> Read symbols from the given file.
ARGS:
<program>... Path to program to debug (with arguments).
一些值得注意的差异
- 要调试的程序的可执行参数可以指定,无需使用 gdb 的
-
标志。 (但不要忘记--
!) - 您可以使用
--gdb
参数指定替代 gdb。来调试您的 Rust:$ ugdb --gdb=rust-gdb
!默认情况下,gdb
将使用$PATH
。 - 可以使用
--log_dir
参数指定替代日志文件目录。默认情况下,日志文件创建在/tmp/
。 - 一些标志可能缺失,要么是因为它们没有意义(例如,
--tui
),要么是因为我忘记添加它们。在后一种情况下,请随意打开一个问题。
用户界面
界面由4个容器组成,用户可以使用类似于vim的控制进行切换:要进入选择模式,按ESC
(由橙色分隔符指示)。然后可以使用箭头键或 hjkl 在容器之间导航。按Enter
进入插入模式并与所选容器交互。或者,按特定容器的快捷键直接从选择模式进入(见下文)。
GDB控制台
使用标准GDB界面进行交互。按i
进入。
PageUp
/PageDown
滚动控制台的输出。Ctrl-b
/Ctrl-e
跳转到缓冲区的开头/结尾。- 使用箭头键/退格键/
Home
/End
移动光标。 - 字符在光标位置插入。
- 使用
Tab
/Ctrl-n
/Ctrl-p
进行标识符和GDB命令的自动完成。 - 使用
Ctrl-r
开始历史搜索,使用Ctrl-c
/左右键接受并继续编辑。
分页器
通过按s
查看和浏览当前程序位置附近的源代码或汇编代码。按s
进入。
- 使用箭头键或 jk 向上/向下滚动,使用
Home
/End
进行跳转。 - 使用
PageUp
/PageDown
在堆栈中导航。 - 使用
Space
在分页器中当前位置切换断点。 - 使用
d
(如果可用)在源代码、汇编和并排模式之间切换。
表达式表
查看和监视GDB表达式(控制台中的所有内容,例如在控制台中可以放在p
之后的内容)。步骤之间的变化会被突出显示。按e
进入。
- 在左侧列中输入一个表达式
- 按
Enter
进入下一行以输入另一个表达式。 - 使用箭头键导航。
- 使用右侧列中的
Space
与结构查看器交互。 - 使用
Tab
/Ctrl-n
/Ctrl-p
进行标识符的自动完成。 - 使用
Ctrl-f
在整数的原始/十六进制/十进制/八进制/二进制格式之间循环。 - 使用
Ctrl-w
(尝试)为当前表达式设置访问观察点。
注意:对于具有自定义美化打印器的结构,查看器可能会有一些问题。一种解决方法是使用变量对象,但这将不允许评估任意表达式。
终端
要调试的程序的控制台tty自动重定向到这个虚拟终端。通过按t
进入,或者按T
进入锁定模式。锁定模式只能通过连续两次快速按Esc
退出。所有其他输入都直接发送到虚拟终端。然而,对于大多数应用程序,常规插入模式就足够了,可以通过单次按Esc
退出。
- 使用
PageUp
/PageDown
向上/向下滚动。 Home
/End
可以直接跳转到输出的开始/结束。
虚拟终端尚未正确实现所有ANSI函数,但对于许多终端应用程序来说相当可用。
IPC接口
ugdb
可以通过基于Unix域套接字的IPC接口远程控制。该接口的文档在此处。实际上这意味着您可以从Vim中安装vim-ugdb并在ugdb中设置断点,使用UGDBBreakpoint
命令。
内置命令
这些命令都以一个前置的!
开始,可以替换常规gdb命令输入到gdb控制台。
!reload
从磁盘读取当前可执行文件。例如,当您重新编译要调试的二进制文件并希望重用现有的ugdb会话时,您应该运行此命令。
!show<file>
在分页器中显示指定的文件。如果您想交互式地设置断点,但不能或不想使用编辑器的IPC调用,这可能很有用(参见vim-ugdb)。
!layout<layout_string>
在运行时更改ugdb的TUI布局。布局字符串代表一个树,叶子是单个字母,代表ugdb的不同面板(c
表示GDB控制台,s
表示分页器,e
表示表达式表,t
表示终端)。节点可以使用分隔符|
和-
水平(例如,c|s|e
)或垂直(例如,c-s-e
)布局。可以使用括号嵌套水平和垂直布局(例如,(c|s)-e
)。最后,节点前面的整数可以定义一个可选的权重(除了默认权重1之外),该权重将用于分配屏幕空间。例如,1c|3s
将创建一个水平和排列控制台和分页器,将大约25%的空间分配给控制台,75%分配给分页器。ugdb的默认布局是(1s-1c)|(1e-1t)
。也可以使用命令行参数--layout
指定初始布局。
常见问题解答
我得到错误消息“因为gdb正忙,无法某物”
因为我们以同步模式与gdb通信,因此一些需要gdb合作的任务(如设置断点和反汇编源文件)在gdb忙时无法完成,即当前调试的程序正在运行。在这种情况下,您必须首先在控制台中按Ctrl-C中断执行。将来可能有可能通过使用非停止模式来解除这种限制,但目前没有立即实施计划。
关于状态的一些说明
这个项目基本上成功地解决了我自己的需求。我将其用作我的主要调试器。从这个意义上说,我认为这个项目“完成”了,但将来可能还会解决一些子需求。
许可
ugdb
在MIT许可下发布。
依赖关系
~17–28MB
~412K SLoC