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


如果有debug说明有调试功能,如果没有debug。说明没有带有调试功能,则不能被调试。