介绍GDB的使用。
Base command
在看GDB之前,先看下openocd是如何运行的,以及GDB是如何连上openocd的。
1 | $ cat cpu.cfg |
remote connection
1 | # 使用local socket连接target |
file
1 | # 导入可执行文件 |
load
1 | # 下载文件 |
run
默认情况下,run 指令会一直执行程序,直到执行结束。如果程序中手动设置有断点,则 run 指令会执行程序至第一个断点处。
1 | # 开始运行 |
start
start 指令会执行程序至 main() 主函数的起始位置,即在 main() 函数的第一行语句处停止执行(该行代码尚未执行)。
1 | (gdb) start |
starti
starti是在main函数的第一条指令处设置断点,再执行run。也就是停在main函数的第一条指令处停止执行。
1 | (gdb) starti |
continue
1 | (gdb) continue |
step
1 | # 执行一步 |
stepi
1 | # 执行一条指令 |
next
1 | (gdb) next |
nexti
1 | (gdb) nexti |
上面这几个有什么区别?
Breakpoint/Watchpoint
break
1 | # 软件断点 |
hbreak
1 | # 硬件断点 |
info break
1 | # 打印breakpoint信息 |
delete breakpoint
1 | (gdb) delete breakpoints 1 |
disable breakpoint
1 | (gdb) |
watchpoint
1 | (gdb) watch *(unsigned int*)0x816c9c00 |
display
display pc
1 | # 打印当前pc |
1 | # 以十六进制打印 |
打印某个地址的值
1 | (gdb) p/x (*(unsigned int *)0x80000000) |
修改某个地址的值
1 | (gdb) set (*(unsigned int *)0x80000000) = 55 |
backtrace
1 | (gdb) backtrace |
Altering Execution
修改变量
1 | (gdb) print x=4 |
从指定位置开始执行
1 | (gdb) j location |
Multiple thread
info thread
1 | # 显示thread信息 |
切换线程
1 | (gdb) thread 2 |
RISCV command
复位
1 | (gdb) monitor reset halt |
修改一片内存
1 | (gdb) monitor mwd 0x80000000 0 0x10000 |
mwd: write doubleword (64bits)
mww: write word (32bits)
mwh: write half word (16bits)
mwb: write byte (8bits)
1 | mwd [phys] addr doubleword [count] |
debug single core image
1 | $ openocd -f ebc.cfg |
debug multi-core image
1 | $ openocd -f ebc-2-hwthread.cfg |