1、编译加 -g
gcc -g test.c -o test
2、常用指令
打开:gdb test
离开:quit
查看源码:l+行数
跳至X行:until
断点:b+行数
查看断点信息:info breakpoints
删除所有断点:delete breakpoints
删除序号为n的断点:delete breakpoints n
禁用断点:disable breakpoints
启用断点:enable breakpoints
运行:r
进入函数调用:step
下一步:step
继续:continue
执行到当前函数返回:finish
查看各级函数调用及参数:breaktrace(bt)
查看当前栈帧局部变量的值:info(i) locals
查看变量:print+变量名
查看变量类型:whatis+变量
跟踪变量:display(取消undisplay)
监视点:watch
where/bt :当前运行的堆栈列表;
bt backtrace 显示当前调用堆栈
up/down 改变堆栈显示的深度
set args 参数:指定运行时的参数
show args:查看设置好的参数
info program: 来查看程序的是否在运行,进程号,被暂停的原因。
3、多进程调试
认设置下,在调试多进程程序时GDB只会调试主进程。
(1)查看状态
show follow-fork-mode
show detach-on-fork
follow-fork-mode detach-on-fork 说明:
parent on 只调试主进程(GDB默认)
child on 只调试子进程
parent off 同时调试两个进程,gdb跟主进程,子进程block在fork位置
child off 同时调试两个进程,gdb跟子进程,主进程block在fork位置
(2)设置调试子进程
set follow-fork-mode child
(3)查询所有进程
info inferiors
(4)切换进程
inferior <infer number>
(5)其他
add-inferior
remove-inferior
clone-inferior
detach
kill
show print inferior-events:用来打开和关闭inferior状态的提示信息。
4、多线程调试
在多线程编程时,当我们需要调试时,有时需要控制某些线程停在断点,有些线程继续执行。有时需要控制线程的运行顺序。有时需要中断某个线程,切换到其他线程。
(1)常用指令
info threads:查看所有线程
thread ID:切换调试的线程
(2)其他指令
break FileName.cpp:LinuNum thread all
所有线程都在文件FileName.cpp的第LineNum行有断点。
thread apply ID1 ID2 IDN command
让线程编号是ID1,ID2…等等的线程都执行command命令。
thread apply all command:所有线程都执行command命令。
set scheduler-locking off|on|step
在调式某一个线程时,其他线程是否执行。在使用step或continue命令调试当前被调试线程的时候,其他线程也是同时执行的,如果我们只想要被调试的线程执行,而其他线程停止等待,那就要锁定要调试的线程,只让他运行。
off:不锁定任何线程,默认值。
on:锁定其他线程,只有当前线程执行。
step:在step(单步)时,只有被调试线程运行。
set non-stop on/off
当调式一个线程时,其他线程是否运行。
set pagination on/off
在使用backtrace时,在分页时是否停止。
set target-async on/ff
同步和异步。同步,gdb在输出提示符之前等待程序报告一些线程已经终止的信息。而异步的则是直接返回。
show scheduler-locking
查看当前锁定线程的模式