文章目录
1.简介
GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。
官方说明文档:https://sourceware.org/gdb/current/onlinedocs/gdb/
在实际应用中,有两种调试方法:在线调试和离线调试。
离线调试适用于开发测试环境,可以自由启停进程,设置断点;在线调试一般用于现场问题分析,不能随便启停进程,对于技术要求较高。
2.GDB启动配置
2.1 服务器启动GDB配置
如果想让系统在信号中断造成的错误时产生core文件, 我们需要在shell中按如下设置:
#设置core大小为无限
ulimit -c unlimited
#设置文件大小为无限
ulimit unlimited
2.2 代码编译设置
若想执行GDB调试,需要在Makefile中添加编译调试选项-g,例如:
gdb dup_file.c –o dum_file_elf –g –lpthread -O0
- -g2 作用是在可执行文件(ELF)中加入源代码的相关信息,比如ELF中第几条机器指令对应源代码的行数。
-g的完整格式是-glevel,其中level中指定了调试信息中包含了调试信息的多少,默认的是2,level=1最少,level=3最多(包括宏定义等信息)。 - -O2 作用是让编译器自动优化我们的代码
-O有4个级别,-O0编译不优化,一般是推荐-O2,设置了-O2后,编译器会试图提高代码性能而不会增大体积和大量占用的编译时间。
O级别 | 说明 |
---|---|
O0 | 不做任何优化 |
O1 | 做部分优化,对于大函数,优化编译占用较多的时间和相当大的内存,使用本优化,编译器会尝试减小生成代码的尺寸,并缩短生成时间,单并不执行需要占用大量编译之间的优化 |
O2 | 比O1更高级的选项,进行更高级的优化,GCC将执行机会所有空间和时间折中的优化,与O1比较而言,O2在优化了编译时间的基础上提高了代码执行效率 |
O3 | O2的基础上打开了更多的优化选项 |
3.基本用法
3.1 GDB常用命令操作
文件<文件名> | 加载调用的可执行文件 | 示例 |
---|---|---|
gdb | 进入调试程序 | ![]() |
run | 重新开始运行文件 | ![]() |
start | 单步执行,运行程序,停在第一执行语句 | ![]() |
list | 查看源码,简写l | ![]() |
打印指针、变量的值 | ![]() | |
set | 设置变量的值 | ![]() |
next | 单步调试(逐过程,函数直接执行),简写n | ![]() |
step | 单步调试(逐语句,跳入自定义的函数内部执行),简写s | ![]() |
backtrace | 查看函数调用的栈帧和层级关系,简写bt | ![]() |
frame | 切换函数的栈帧 | ![]() |
info | 查看函数内部局部拜年的数值,简写i | ![]() |
finish | 结束当前函数,返回调用点 | ![]() |
continue | 继续运行,简写c | ![]() |
quit | 退出gdb调试,简写q | ![]() |
3.2 查看文件是否带有调试功能
3.2.1 执行:gdb 程序名
如果带有如下提示信息,则说明程序带有调试功能
3.2.2 使用命令:readelf -S main|grep debug
如果有debug说明有调试功能,如果没有debug。说明没有带有调试功能,则不能被调试。