基于GDB的程序调试
基于GDB的程序调试
程序调试工具GDB
编译器GCC,项目构建工具Make(又称gmake),以及GDB。

GDB是什么?
GDB:GNU symbolic debugger是Linux下常用的程序调试器
GDB可以做什么?

GDB官网:GDB: The GNU Project Debugger (sourceware.org)
调试案例一
1  |  | 
在编译程序的时候,需要加调试选项: -g
1  |  | 
使用gdb启动程序:
1  |  | 
进入gdb调试环境:

在调试环境中:使用l选项会显示带行号的源代码

但是默认情况下,l选项只显示10行源代码,如果查看后续代码,在调试界面Enter回车即可

在第7行源代码处打断点:

运行程序,遇到断点停止:

查看代码中变量n的值

当前n的值为1,$1表示该变量所在存储区的名称
在程序第12行处打断点

继续执行程序

查看当前n变量的值

当前n的值为101
退出调试

查看调试环境所有断点:

删除第7行的断点:

禁用编号为2的断点:

注意断点状态Enb(enable)由y变成n,代表禁用
恢复编号为2的断点:

小结
GDB有三种调试模式:
调试执行程序:(前面的案例),注意编译加调试信息(-g)
调试core文件 :需要对系统设置的core文件大小作调整(ulimit - c unlimlited),否则可能无法 产生core文件
调试正在执行的程序(gdb attach) :Top找到进程编号pid,Gdb attach pid
GDB结构组成:

常用调试指令:
启动指令
调试程序:gdb program
根据core文件调试程序:gdb program corefile
跟踪调试进程:gdb attach pid
程序运行
run,该命令会运行至程序结束,除非遇到断点或报错
单步执行
步进执行不进栈?next
步进执行,进栈step
代码查看
列出断点附近或程序所有代码list
设置现实代码的行数 set listsize <n>
退出调试
quit
查看栈信息
bt 打印当前的函数调用栈的所有信息
bt <n> n是一个正整数,表示只打印栈顶上n层的栈信息
bt <-n> 表示只打印栈底下n层的栈信息
设置断点
代码断点:
- break lineNumber | functionName
 - break lineNumber | functionName if condition
 - tbreak lineNumber | functionName 临时断点,仅能使用一次
 
内存断点(观察点):
- 监控内存值改变 watch expr [if condition]
 - 监控内存值被读取 rwatch expr [if condition]
 - 监控内存值被读取和写入 awatch wxpr [if condition]
 
事件断点:
- C++ exception,使用catch exception [name]
 - Ada exception,使用catch handlers [name]
 - exec事件,使用catch exec
 - fork事件,使用catch fork 或者 catch vfork
 - 加载和卸载动态so事件,使用catch load|unload [regexp]
 - 监听系统信号,使用catch signal [signal]
 - 监听系统调用,使用catch syscall[name|number|group:groupname|g:groupname]…
 
打印变量:
- Print [file | func]::variable 查看局部变量或全局变量
 - Print *array@len 数组首地址@查看长度
 - x/[n | u] <addr> x命令查看内存地址钟的值,n:表示显示内存的长度,u:表示从当前地址往后请求的字节数
 
打印寄存器:
info register 查看寄存器(除了浮点寄存器)
all-registers 查看所有寄存器
info registers <reg_name …>查看所指定寄存器
参考资料
来源培训PPT 作者:Relax 邮箱:wangw111@icloud.com
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!