二进制调试
lldb、GDB 常用的小技巧。
安装
# 不知道的名字的情况下,可以先搜索
$ apt-cache search lldb
# 常用用具
$ sudo apt install gcc
$ sudo apt install gdb
$ sudo apt install llvm
$ sudo apt install lldb
一开始,都是使用 lldb 来进行调试的,但在老的 80386 系统上,lldb 有些兼容和适配问题,具体可以参考 https://www.mail-archive.com/lldb-dev@lists.llvm.org/msg08245.html 所以,如果是 i386 的话,推荐使用 gdb 来进行调试。
LLDB 调试技巧
参考
# 编译代码
$ gcc main.c
# 调试程序
$ lldb a.out
# 设置断点 setbreakpoint
(lldb) b main
# 根据地址设置断点
(lldb) b 0x001
# 启动断点
(lldb) process launch --stop-at-entry
# 运行
(lldb) r
# 下一步 next
(lldb) n
# 或使用 step-over 命令
# (lldb) thread step-over
# 回车下一步,回车是重复执行上一个命令
(lldb) [ENTER]
# 读取内存信息
(lldb) x $rbp
# 读取寄存器信息
(lldb) re r
# 或制定读取
# (lldb) register read $rbp
# 读取所有寄存器
(lldb) re r -a
# 读取内存
(lldb) x 0x001
# 退出 lldb
(lldb) exit
GDB
$ gdb ./a.out
# 查看汇编
# https://stackoverflow.com/questions/1902901/show-current-assembly-instruction-in-gdb
(gdb) layout asm
# 开始即断点
# https://stackoverflow.com/questions/10483544/stopping-at-the-first-machine-code-instruction-in-gdb
(gdb) starti
# step in
(gdb) si
# 汇编下一步
(gdb) si
# 查看寄存器
(gdb) info registers
# 查看内存
(gdb) x/16x 0x804a00e
# 退出
(gdb) quit
lldb vs gdb
https://lldb.llvm.org/use/map.html
其他 CLI
- 查看二进制格式
nm ./a.out
- 查看汇编代码
objdump -S ./a.out
修改文件
# 删除所有行
:%d
参考
- https://www.nesono.com/sites/default/files/lldb%20cheat%20sheet.pdf
- https://lldb.llvm.org/use/tutorial.html