gdb常用指令

:start 开始调试,停在第一行代码处,(gdb)start
info br 显示当前已有断点
clear clear 750删除750行所有断点
l list的缩写查看源代码,(gdb) l [number/function]
b b: Breakpoint的简写,设置断点。(gdb) b 10
b b: Breakpoint的简写,设置断点。(gdb) b main
b filename:[line/function] b:在文件filename的某行或某个函数处设置断点
x/10i $pc
i breakpoints i:info 的简写。(gdb)i breakpoints
d [bpNO] d: Delete breakpoint的简写,删除指定编号的某个断点,或删除所有断点。断点编号从1开始递增。 (gdb)d 1
s s: step执行一行源程序代码,如果此行代码中有函数调用,则进入该函数;(gdb) s
n n: next执行一行源程序代码,此行代码中的函数调用也一并执行。(gdb) n
r Run的简写,运行被调试的程序。如果此前没有下过断点,则执行完整个程序;如果有断点,则程序暂停在第一个可用断点处。(gdb) r
c Continue的简写,继续执行被调试程序,直至下一个断点或程序结束。(gdb) c
finish 函数结束
p [var] Print简写显示指定变量(临时变量或全局变量例如 int a的值。(gdb) p a
display [var] display,设置想要跟踪的变量(例如 int a)。(gdb) display a
undisplay [varnum] undisplay取消对变量的跟踪,被跟踪变量用整型数标识。(gdb) undisplay 1
set args 可指定运行时参数。(gdb)set args 10 20
show args 查看运行时参数。
help [cmd] GDB帮助命令,提供对GDB名种命令的解释说明。(gdb)help
回车 重复前面的命令,(gdb)回车

举例

golang 使用 gdb调试的方法
首先编译可调试的二进制文件,在编译过程中添加-gcflags "-N -l"参数,例如
CGO_ENABLED=0 GOOS=linux go build -mod=vendor -a -ldflags ‘-extldflags “-static”’ -gcflags “-N -l” ./cmd/swagger
然后使用gdb对生成的二进制进行调试
gdb /root/go/swagger
进入gdb之后如果二进制需要添加参数才能运行,需要先执行:set args 参数名称,例如
set args generate server --template-dir=/tmp/harbor/tools/swagger/templates --exclude-main --additional-initialism=CVE --additional-initialism=GC -f api/v2.0/swagger.yaml -A harbor --target src/server/v2.0

b shared.go:750
然后执行run,程序开始运行

where
readelf -a testsuite | $tee > elf.txt 查看二进制的内容,并保存到 elf.txt 文件中
info threads 显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID,后面操作线程的时候会用到这个ID。 前面有*的是当前调试的线程。
thread ID 切换当前调试的线程为指定ID的线程。
break thread_test.c:123 thread all 在所有线程中相应的行上设置断点