1、编译命令:gcc -g -o xxx.o xxx.c(-g方便调试,加载进符号表)
2、开始gdb调试:gdb xxx.o
3、基本命令:
-
l main(列出主函数,格式:l xx)
-
set listsize 20(调整显示行数)
-
b 8(在第8行下一个断点)
info b(查看当前断点信息)
disable 1 (不启用1这个断点)
enable 1 (启用1这个断点) -
run (r)(运行)
-X/nuf
x &变量(查看变量值和地址)
x/d x/f(可以以不同的方式输出值)
待续 -
P *arr@len(查看数组内存)
-
b 18 if sum>125(条件断点,当符合条件时,击中断点)
-
n s(不进函数内运行,进到函数内运行)
-
p 变量(打印变量)
-
info locals (查看当前全部局部变量)
-
finish (结束当前函数)
-
watch 变量(观察变量的变化,当有变化时停下)
-
watch main::i(观察指定的局部变量或全局变量)
-
p 变量=5(修改变量的值,使他变成5)
-
捕捉点 catch < even >
catch fork (调用系统调用fork时停止)
catch exec(调用系统调用exec时停止) -
搜索源代码
forward-search < regexp >(向前搜索)
reverse-search < regexp >(全部搜索) -
命令
commands bnum(在bnum断点处执行命令)
>shell ls
>printf i
…
end
4、多线程与多进程调试:
-
show follow-fork-mode(查看当前进程)
-
set follow-fork-mode child(使程序进入子进程)
-
gdb attach < pid >(将gdb挂到进程号为pid的进程上)
attach pid -
想要击中断点程序得运行在当前进程中,可以先查看当前进程,若不在断点所在进程,设置进程
-
show detach-on-fork (查看detach-on-fork模式)
-
set detach-on-fork [on|off]( on:断开调试follow-fork-mode调试的指定进程
off:gdb将控制父进程和子进程。follow-fork-mode指定的进程将被调试,另一个进程置于暂停(suspended)状态。)
-
info inferiors(查询正在调试的进程,gdb会为他们分配唯一的Num号,其中前面带’*'号的就是正在调试的进程)
-
inferior (切换调试的进程为inferior num的进程处)
-
add-inferior [-copies n] [-exec executable] (添加n个新的调试进程,可以用file executable来分配给inferior可执行文件。如果不指定n,则只增加一个inferior;如果不指定executable,则执行程序留空,增加后可使用file命令重新指定执行程序;这时候创建的inferior其关联的进程并没启动。)
-
detach inferior infno(断开(detach)掉编号是infno的inferior。值得注意的是这个inferior还存在,可以再次用run命令执行它。)
-
remove-inferior infno(删除一个infno号的inferior。删除前需要先kill或者detach这个inferior,因为当一个inferior正在运行时不能被删除.)
-
多线程调试
gcc -g thread.c -o thread.o -lpthread
1)默认跟主线程,子线程停在create phread的程序上
2)info threads(查看当前的线程id)
3)待续