GDB
gdb cheat sheet:https://darkdust.net/files/GDB Cheat Sheet.pdf
调试之前执行一些初始化代码,在用户目录下新建 .gdbinit 文件,例如 ~/.gdbinit
directory /usr/src/musl-libc layout src // -tui set pagination off
调试 musl
wget https://musl.libc.org/releases/musl-1.2.4.tar.gz tar -zxf musl-1.2.4.tar.gz && cd musl-1.2.4 make distclean && ./configure --enable-debug make -j8 && sudo make install cd ~ && /usr/local/musl/bin/musl-gcc ~/main.c -g3 -static gdb a.out
record full:GDB 会记录程序的每一条指令执行,并将执行过程保存在一个文件中,以便后续回放和分析
调试多线程:https://sourceware.org/gdb/current/onlinedocs/gdb.html/Threads.html
show scheduler-locking // 显示线程的 scheduler-locking 状态 set scheduler-locking on // 锁定线程,只有当前线程或指定线程可以运行 info threads
查看内存信息:info proc mappings
忽略某些信号:handle SIGUSR1 SIGSEGV nostop
调试程序
- 1Byte(字节) = 8bit(位)
- 寄存器位于 CPU 中
- 32 位,即 4 个字节
- 64 位,即 8 个字节
- cpu 从寄存器中取数,送到算逻单元 ALU 中计算
- info registers
- info all-registers
- info registers rsp
- x/16x $rsp
- x/4xb &i
几个常用的寄存器
- sp/esp/rsp(16bit/32bit/64bit)栈寄存器---指向栈顶
- bp/ebp/rbp 栈基址寄存器---指向栈底
- ip/eip/rip 程序指令寄存器---指向下一条待执行指令
https://sourceware.org/gdb/documentation
https://eli.thegreenplace.net/tag/debuggers
https://jyywiki.cn/OS/2023/build/lect8.ipynb.html