CSerht / ysyx-sdb-tui

A simple tui used for sdb in the ysyx project's nemu or npc.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

ysyx-sdb-tui

A simple tui used for sdb in the ysyx project's nemu or npc.

Examples

特点

  • 低依赖,只需要按照极少依赖即可运行
  • 模块化,独立模块,提供了对外的几个接口,只需要修改少量源码即可运行
  • 高性能,此工具几乎不会影响你正常运行程序,唯一的损耗是程序在调试时需要添加 -ggdb和开启 O1优化

使用指南

以下均在 Ubuntu 22.04 环境下测试成功,其他版本未知。

实现方法

  1. 编译AM程序的时候添加 -ggdb以增加调试信息
  2. 使用Python解析ELF文件,并生成GDB命令列表文件
  3. GDB执行命令并生成包含源码和反汇编代码信息的文件
  4. 使用 vimremote功能创建vim服务器
  5. NEMU在作为客户端给vim服务器发送命令并执行
  6. NEMU通过让vim服务器加载vim脚本方式定位和高亮
  7. (可选)使用 tmux所带来的福利自动分割和启动窗口

安装依赖

  • apt install vim-gtk以使得 vim支持 clientserver,使用 vim --version | grep clientserver 查看是否有 +clientserver
  • apt install gdb-multiarch 以支持RISC-V的 gdb 功能,注意,非Ubuntu用户可能使用其他的 gdb 工具链
  • pip(3) install pyelftools 以使得Python可以解析ELF文件
  • 其他依赖,欢迎补充

NEMU

  1. disasm-autojump.cdisasm-highlight.vim放在NEMU的 utils目录下(放别的地方也可以,无影响)
  2. Kconfig合适的位置添加 VIM_AUTO_JUMP
  3. init_monitor函数的 longimg_size=load_img();之后合适的位置声明和调用 disasm_init_vim_script(cpu.pc)
  4. execute函数中的 for 循环体结束后添加 disasm_pos_and_hl(s.dnpc) [这里有一个修改,应该是dnpc而不是pc,这样高亮显示的就是下一条即将执行的指令。]

Warning

$\color{red}{请不要}$disasm_pos_and_hl()函数放在 trace_and_difftest 中,这样会大量执行 system() ,这可能导致你的操作系统产生损坏!

AM

  1. abstract-machine添加CFLAGS += -ggdbGDB = gdb-multiarch,并且把O2改为O1,然后将AM目录下的所有build清除,重新编译
  2. nemu.mkimage:下添加: GDB_CMD_LIST := $(AM_HOME)/tools/gdb-cmd.txt
	@$(OBJDUMP) -M no-aliases -d $(IMAGE).elf > $(IMAGE)-no-aliases.txt
# Only for debugging, close it in other cases
	@echo + GDB-GEN-TXT "->" ${IMAGE}-gdb-gen.txt
	@python3 ${AM_HOME}/tools/gdb-cmd-gen.py ${IMAGE}.elf ${GDB_CMD_LIST}

# We use a simple method to fix the '__am_asm_trap' symbol,
# but not all programs have this symbol.
# If you encounter and error here, ignore it.
	-@$(GDB) --batch -x ${GDB_CMD_LIST} > ${IMAGE}-gdb-gen.txt

Tmux (optional)

关于tmux,你可以参考以下指令序列,加在Makefile合适的位置,也可以选择不管,这项内容还不是很完善。

# If you don't run in tmux, the following code will not work.
ifneq ($(shell echo $$TMUX),)
	@tmux kill-pane -a
	@sleep 0.2
	@tmux split-window -h
	@sleep 0.2
	@tmux split-window -v
	@sleep 0.2
	@tmux swap-pane -s 0 -t 2
	@sleep 0.2
	@tmux send-keys "vim ${IMAGE}-gdb-gen.txt" C-m
	@sleep 0.2
	@tmux select-pane -t 1
	@sleep 0.2
	@tmux send-keys "touch build/nemu-log.txt" C-m
	@sleep 0.2
	@tmux send-keys "tail -f build/nemu-log.txt" C-m
	@sleep 0.2
	@tmux select-pane -t 2
	@sleep 0.2
endif

运行

我假设你没有使用上面的tmux脚本。

  1. 使用make ARCH=ISA编译AM程序
  2. 使用vim --servername VIM YouFile打开build目录下生成的gdb反汇编文件(启动vim服务器)
  3. 使用make ARCH=ISA run运行你的程序(连接VIM服务器)

注意,如果你不小心同时打开了多个vim服务器,并且名字都为VIM,NEMU只会连接到第一个打开的名字为VIM的服务器,其他服务器的名字vim会自动为你改名,服务器的名称是唯一的,你可以使用vim --serverlist查看。

还需要做的一些优化

由于大型程序生成源码汇编文件慢,并且每次更新都需要生成,这里还可以继续改进,比如记录修改的文件,检测修改文件的符号信息,只修改相关的符号,而不是重新生成。以及相关的开关,都需要做优化。

未来计划

该工具的设计充分遵循了UNIX设计哲学,更多的提供的是把这些工具联系起来的思路。

我们在AM的Python脚本中生成gdb指令,这意味着可以使用gdb的所有能力去生成想要的东西,而不需要自己再去解析调试信息了,然后修改NEMU的vim脚本做相关的匹配。

我们也可以配置更强大的vim,比如把vim打造为IDE,这一点网上有很多教程。然后可以为vim脚本添加更多功能,这样我们就可以更灵活地操作更多事情了。(vim脚本可能不那么友好,但是它支持调用python的,python在vim脚本内也可以使用vim库)

之后再为NEMU添加一些sdb指令,类似于gdb tui相关的指令,嗯……整体设想还是很美好的,其可行性和必要性还值得商榷,关键点在于vim本身只是文本编辑器,更多的是支持静态脚本,vim GUI和其命令执行是在一个线程,如果你运行一个动态脚本,会导致界面非常卡,以及vim服务器的通讯能力非常差,导致可做的扩展很少。

About

A simple tui used for sdb in the ysyx project's nemu or npc.

License:MIT License


Languages

Language:C 37.3%Language:Vim Script 33.8%Language:Python 28.9%