一、基本命令
gcc -g test.c -o test #编译时生成debug有关的程序信
gdb test #启动调试
help #查看命令帮助,具体命令查询在gdb中输入help + 命令,简写h
run #重新开始运行文件(run-text:加载文本文件,run-bin:加载二进制文件),简写r
start #单步执行,运行程序,停在第一执行语句
list #查看原代码(list-n,从第n行开始查看代码。list+ 函数名:查看具体函数),简写l
set #设置变量的值
next #单步调试(逐过程,函数直接执行),简写n
step #单步调试(逐语句:跳入自定义函数内部执行),简写s
backtrace #查看函数的调用的栈帧和层级关系,简写bt
frame #切换函数的栈帧,简写f
info #查看函数内部局部变量的数值,简写i
finish #结束当前函数,返回到函数调用点
continue #继续运行,简写c
print #打印值及地址,简写p
quit #退出gdb,简写q
break+num #在第num行设置断点,简写b
info breakpoints #查看当前设置的所有断点
delete breakpoints num #删除第num个断点,简写d
display #追踪查看具体变量值
undisplay #取消追踪观察变量
watch #被设置观察点的变量发生修改时,打印显示
i watch #显示观察点
enable breakpoints #启用断点
disable breakpoints #禁用断点
x #查看内存x/20xw 显示20个单元,16进制,4字节每单元
run argv[1] argv[2] #调试时命令行传参
set var 变量名=value 设置变量的值
set follow-fork-mode parent
set follow-fork-mode child
二、调试core文件
程序挂掉时(比如出现段错误时),系统缺省不会生成core文件
(1) ulimit -a 查看系统参数
(2)ulimit -c unlimited 把core文件的大小设为无限制
先切换到root用户,输入这个命令 echo core >/proc/sys/kernel/core_pattern(设置core文件出现在当前路径),再执行ulimit -c unlimited
(3) 运行程序,生成core文件 ;
(4)gdb 程序名 core文件名(gdb ./main core)
从图中就可以看出是在 bb函数中出现的段错误
三、调试正在运行的程序
先找到正在运行程序的进程号,然后执行 gdb ./main -p 进程号,这时候正在运行的程序就会暂停,这时调试就跟普通调试一样了。
四、调试多进程程序
调试父进程: set follow-fork-mode parent (缺省)
调试子进程: set follow-fork-mode child
设置调试模式:set detach-on-fork [onloff],缺省是on 表示调试当前进程的时候,其它的进程继续运行,如果用off调试当前进程的时候,其它的进程被gdb挂起。
查看调试的进程:info inferiors
切换当前调试的进程: inferior 进程id
五、调试多线程程序
在shell中执行
查看当前运行的进程: ps aux| grep book
查看当前运行的轻量级进程: ps -aL |grep book
查看主线程和新线程的关系: pstree -p 主线程id
在gdb中执行
查看线程: info threads
切换线程: thread 线程id
只运行当前线程: set scheduler-locking on
运行全部的线程: set scheduler-locking off
指定某线程执行某gdb命令: thread apply 线程id cmd
全部的线程执行某gdb命令: thread apply all cmd
六、利用日志文件来调试