Linux中的GDB的作用与GCC的区别
GDB(GNU Debugger)是一个开源的调试工具,专门用来调试用C、C++等编程语言写成的程序。它能帮助开发者在程序运行时观察程序内部的状态,从而快速定位和修复bug。
主要功能
-
1.启动程序
你可以用GDB启动可执行程序,它会在程序入口处暂停,让你开始调试。 -
2.设置断点(breakpoints)
你可以在程序的某一行或某个函数上设置断点,让程序在那个位置暂停。 -
3.单步执行(step/bstep)
逐行执行代码(step),或者逐过程跳转(next),观察程序的执行流程。 -
4.观察变量(print 或 display)
可以打印出变量的值,观察其变化情况,帮助分析错误。 -
5.修改变量
在调试过程中,可以修改变量的值,测试不同的场景。 -
6.调用栈(backtrace)
当程序崩溃时,可以显示调用堆栈,找到出错的函数调用路径。 -
7.追踪内存和寄存器
可以检查内存内容和寄存器状态。 -
8.多线程调试
支持多线程程序的调试,跟踪每个线程的状态。
工作流程
1.编译时添加调试信息
使用-g参数编译程序,让GDB能识别源码与二进制的对应关系。例如:
gcc -g myprogram.c -o myprogram
解释:
-
gcc:调用GCC编译器,用来编译源代码。
-
-g:告诉编译器在生成的可执行文件中包含调试信息(调试符号)。
这意味着,生成的程序会保存源码中的变量名、行号等信息,方便调试工具(如GDB)分析程序。 -
myprogram.c:源代码文件名,包含你要编译的C语言代码。
-
-o myprogram:指定输出文件的名字为myprogram,这个是编译生成的可执行文件的文件名。
-
如果没有-o选项,默认输出文件名通常是a.out。
2.启动GDB
在终端输入:
gdb ./myprogram
进入GDB命令界面。
3.运行程序
在GDB中输入:
run
这会开始执行程序,直到遇到第一个断点或程序结束。
4.设置断点
例如,在main函数第一行:
break main
或者在某一行:
break 25
5.单步调试
- 执行下一行:next
- 进入函数:step
- 继续运行直到断点:continue
6.检查变量
print variable_name
7.观察变量变化(实时显示)
display variable_name
8.程序崩溃后分析
在程序崩溃时,可以使用:
backtrace
9.退出GDB
quit
GDB常用命令汇总
命令 | 作用 |
---|---|
break 或 b | 设置断点(如:break main 或b 25 ) |
run | 开始执行程序 |
next | 执行下一行(不进入函数内部) |
step | 执行下一行,若是函数,则进入函数内部 |
continue | 继续执行,直到遇到下一个断点或程序结束 |
print 或 p | 打印变量值(如:print x ) |
display | 自动在每次暂停时显示变量 |
backtrace | 打印调用堆栈,帮助定位出错位置 |
quit | 退出GDB |
与GCC的区别
GCC
作用
- GCC 是一套用来将源代码(比如C、C++、Fortran、Go等)编译成机器代码(可执行文件)的工具。
- 它负责“翻译”程序源码,让计算机能够理解和执行。
主要职责
- 语法分析、优化代码
- 生成目标代码(目标文件)
- 最终链接成可以运行的程序
小结
- 作用:编译源代码
- 输入:源码文件(.c、.cpp)
- 输出:可执行文件或目标文件 (*.exe, *.o)
- 作用阶段:前端到后端的编译过程
GDB
作用
- GDB 是一款调试工具,用来在程序运行时“观察”和“控制”程序状态。
- 它帮助开发者查找程序中的错误(bug),理解程序流程,修改变量值等。
主要职责
- 运行程序,设置断点
- 单步调试
- 查看变量,堆栈信息
- 分析程序崩溃原因
小结
- 作用:调试和分析程序
- 输入:已编译的可执行文件(考虑调试信息)
- 输出:调试信息、断点控制、变量值等
- 作用阶段:调试阶段,程序执行时
区别总结
特点 | GCC | GDB |
---|---|---|
作用 | 编译源代码,将源码转为可执行程序 | 调试已生成的可执行程序 |
功能 | 语法分析、优化、生成目标文件和可执行文件 | 观察、控制程序执行、查找错误 |
使用场景 | 开发阶段写代码、编译程序 | 调试运行中的程序,修复 bug |
输入 | 源代码文件(如 .c、.cpp) | 可执行文件(带调试信息的程序) |
输出 | 可执行程序或目标文件 | 调试信息、变量值、调用堆栈等 |
- GCC就像是“翻译员”,负责把你写的高层次源码翻译成计算机能理解的机器码。
- GDB则像是“侦探”或“助手”,在程序运行时帮助你观察和控制程序的行为,找出隐藏的问题。