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调试

Download history • Rust 包仓库 2/week @ 2024-04-23 • Rust 包仓库 4/week @ 2024-06-11 • Rust 包仓库 20/week @ 2024-07-02 • Rust 包仓库 306/week @ 2024-07-30 • Rust 包仓库

306 每月下载量

MIT 许可证

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