编译时要加-g
- gdb 可执行文件名
在gdb内就可以:
- file 可执行文件名
- start
- break n:在n行设置断点
- break 函数名称:程序进入指定功能函数时停止运行
- break 行号/函数名称 if 条件:符合if语句条件时,运行到指定位置停止运行
- run:运行程序
- continue:继续运行程序
- next:单步执行程序语句
- step:进入子函数
- print:显示变量的值,print a=n,给a赋值n
- print $:显示给定序号的前一个序号的值
- print $$:显示给定序号的前两个序号的值
- print 开始表达式@要打印的连续空间大小:用于打印数组,开始表达式例子,a[2]
- enable:enable命令可以恢复暂时不起作用的断点,例如程序已经运行完了第二个断点,反过来还想运行第一个断点处,此时可以使用enable命令。(多个断点加空格)enable后run
- disable:使断点失效,然后用continue命令继续执行程序
- delect:清除断点,需要标明断点的编号,没有提示信息
- clear:清除断点,需要标明断点所在的行号,会有提示信息
- display:用于显示表达式的值,该命令每当程序运行到断点处就会显示表达式的值
- disable display/delete display/undisplay 序号:无效显示
- enable display:恢复失效
- whatis:显示数据类型
- ptype:显示数据类型,同时给出类型的定义(如类和结构体变量)
- set variable a=n:给a设置值为n
- x/<n/f/u><addr>:查看此内存地址中的值。n表示显示内容的个数。f表示的输出格式有如下,
x:十六进制整数
d:有符号十进制整数
u:无符号十进制整数
o:八进制整数格式
t:二进制整数格式
c:字符格式
f:浮点数格式
u表示从当前地址开始向后请求的字节数。默认为4字节
b:字节
h:双字节数值
w:4字节数值
g:8字节数值
使用观察窗口功能及其命令
- watch:用于监视被写的内容,一旦表达式值<a>3>(或变量值a)有变化,就立即停住程序
- rwatch:当表达式值(或变量值)被读取时,就停住程序
- awatch:用于当表达式的值被读或写时,停住程序
- info watchpoints:用于列出当前所有监视点的相关信息
检查栈信息功能及其命令
当程序调用了一个函数时,函数的地址、函数参数、函数内的局部变量都被压入并保存在栈中。
- backtrace:简写bt,用于显示当前的函数调用栈的所有信息
- backtrace n:简写bt n,只显示栈顶上n层的栈信息,若n为负整数时,表示只显示栈底下n层的栈信息
- frame n:显示第n层栈的信息,没有n表示显示当前栈层的所有信息
- up n:向栈底方向移动n层,没有n为一层
- down n:向栈顶方向移动n层,没有n为一层
- info frame:简写info f,可以显示更为详细的栈层信息
- info args:显示当前函数的参数及值
- info locals:显示当前函数局部变量及其值
- info catch:显示当前函数中的异常处理信息
检查源代码功能及其命令
- list:显示当前行号后面的代码(<表示list后面加上的值>)
- <+>:显示当前行号后面的代码
- <->:显示当前行号前面的代码
- <n>:显示程序第n行周围的代码
- <function>:显示函数名为function的功能函数代码
- <first,last>:从first行到last行
- <,last>:当前行到last行
- <filename:n>:显示文件名为filename的文件的第n行代码
- <filename:function>:显示文件名为filename的文件中的函数名为function的函数的代码
- set listsize <count>:设置每一次显示源代码的行数
- show listsize:查看当前显示源代码的行数设置
查看源代码内存
- info line:后面跟参数可以是行号也可以是函数名
- disassemble:查看源程序当前执行时的机器码,即汇编代码
改变程序的运行及其命名
set命令
- set $pc=0x400531:更改跳转执行的地址
jump命令
- jump <file:line>:代表跳转到此行开始运行
- jump <addr>:跳转到地址为addr处的语句开始执行
return命令
- return <exp>:将表达式的值作为函数返回值,没有表达式就正常返回
call命令
- call <exp>:显示表达式的值,或显示函数的返回值
gdb调试多进程程序
先运行服务器,然后找到目标子进程的PID,再将其附加(attach)到gdb调试器上
- ps -awx |grep cgisrv
- gdb
- attach 4183
follow-fork-mode允许我们选择程序在执行fork系统调用后是继续调试父进程还是调试子进程
- set follow-fork-mode mode:mode的可选值是parent和child
gdb调试多线程程序
- info threads:显示当前可调试的所有进程。每个线程都有ID,ID前面有“*”号的线程是当前被调试的线程
- thread ID:调试目标ID指定的线程
- set scheduler-locking [off/on/step]:调试多线程时,默认除了被调试线程在执行外,其他线程也在继续执行,这是默认值;on表示只有当前被调试的线程会继续执行;step表示在单步执行的时候,只有当前线程会执行
本文详细介绍了GDB调试器的使用,包括观察窗口、检查栈信息、查看源代码和内存、改变程序运行等核心功能。通过设置断点、单步执行、查看变量值、调试多进程和多线程程序等命令,帮助开发者更有效地进行程序调试。
1481

被折叠的 条评论
为什么被折叠?



