gdb的启动 --gdb 程序名 [corefile] --corefile是可选的,但能增强gdb的调试能力 --强调:启动gdb必须在编译命里加上"-g"参数,"-g"一般写在遍历命令的靠前位置,例如--gcc -Wall -g -o hello.o -c hello.c
"-q"命令 --命令格式:gdb -q 执行程序 --不显示gdb版本信息
gdb命令集合 --直接运行调试命令 gdb 程序名 --"run" 开始调试程序 --"where" 显示导致段错误的执行函数树 --"list[m,n]" m,n是要显示包含错误首次出现位置的起始行和结尾行。不带参数的list命令将显示附近的10行代码 --"print" print 变量,表达式 print 'filename'::变量或表达式 --''是必须的,以便让gdb知道指的是一个文件名。 print funcname::变量或表达式 --"whatis" 告诉你变量的类型 --"ptype" 告诉你结构的定义 --"break" 设置断点 break linenum(行号) break funcname(函数名) break filename:linenum break filename:funcname --"continue" 从断点以后继续执行,并非单步 --"delete" 删除一个端点 语法格式:delete 断点编号 断点编号是由"info break"获取的 --"info break" 查看已设置断点的信息 --"set variable" 命令格式是:set variable varname=value varname是变量名称,value是变量的新值
gdb单步调试 --"step" 当遇到一个函数的时候,step将进入函数,每次执行一条语句,相当于vs中的F10命令 --"next" 当遇到一个函数的时候,next将执行整个函数,相当于vs中的F5命令 --"return " 相当于在函数中直接return ,并且将value作为返回值返回给调用者。 --如果需要重复执行一条命令,不需要每次都键入命令,gdb记住了最后一个被执行的命令,只要简单的按 enter键就可以重复执行最后的命令
gdb调试带参数的程序 进入gdb调试界面 输入参数命令set args 后面加上程序所要用的参数,注意,不再带有程序名,直接加参数,如: set args a.txt b.txt 回车后输入 run
gdb多文件调试 如果调试的文件不在当前目录下,需要将文件目录加载到程序中,如果在当前目录下不需要加载目录 --命令行 "DIR ../common" 在文件中添加断点 --命令行 "bread helper.c:68" 在helper.c文件的第68行加断点
跳出循环:
until LineNum
执行到一个比当前行号大的行,或者也可以指定在当前frame中的某一行
跳出函数:
finish
执行,直到选定的frame执行结束,然后打印返回值,将其放入历史值中,停止
gdb多线程调试
在多线程编程中,经常会遇到死锁问题,这时候需要使用pstack命令来查看线程在哪个函数中锁住了