1、使用gdb在qemu上调试程序
1.1、第一步:在qemu上运行程序并开启gdb server
- qemu-system-riscv64 -nographic -machine virt -m 128M -smp 1 -kernel …/bin/test.elf -s -S
1.2、第二步:使用gdb客户端连接gdb server
-x:指定gdb的配置文件,这个不是必须的。使用配置文件可以提高调试效率,将每次开始gdb调试都需要输入的命令,提前写到配置文件中。
配置文件实现的效果和在命令行手动敲命令是一样的。
2、使用TUI模式调试
命令 | 功能 |
---|---|
layout src | 显示源码窗口 |
layout asm | 显示汇编窗口 |
layout regs | 在之前的窗口上再显示寄存器窗口 |
layout split | 同时显示源码、汇编窗口 |
layout next | 显示下一个layout |
layout prev | 显示上一个layout |
3、快捷方式
-
ctrl键 + n:下一条命令(功能和在linux命令行使用“下键”来查看之前输入过的命令)
-
ctrl键 + p:上一条命令(功能和在linux命令行使用“上键”来查看之前输入过的命令)
-
切换焦点:
- focus next:切换到下一个显示窗口(切换焦点,也就是可以通过“上下键”来翻看窗口代码)
- focus prev:切换到上一个显示窗口(切换焦点,也就是可以通过“上下键”来翻看窗口代码)
- 总结:focus next和focus prev是同时显示两个窗口时使用
-
查看窗口源码的快捷键:
- PGUP键:向上翻页
- PGDN键:向下翻页
- 上键和下键:上下滑动查看源码
-
shell + linux命令:在gdb命令行使用linux命令
4、gdb常用指令
5、断点设置指令
break:设置断点,简写bb func 断点函数b file:linenum 断点文件行号b *address 断点地址enable/disable:使能/去使能断点en/dis 1 使能/去使能断点1en/dis 使能/去使能所有断点delete:删除断点delete 1 删除断点1delete 删除所有断点info breakpoints:显示所有断点信息checkpoint:记录断点状态,用于恢复断点。不可用于多线程checkpointrestart 1Info checkpoint:显示checkpoint信息watch:跟踪变量值,当变量值发生变化时,暂停watch a 局部变量,在跳出当前函数时会失败watch *0x600af0Info watchpoint:显示watchpoint信息
6、解决SecureCRT软件显示乱码
- 显示乱码的原因是字符编码格式不匹配,SecureCRT软件字符编码默认是“Default”模式