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 2/week @ 2024-04-23 4/week @ 2024-06-11 20/week @ 2024-07-02 306/week @ 2024-07-30

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