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能识别源码与二进制的对应关系。例如:

bash 复制代码
gcc -g myprogram.c -o myprogram

解释:

  • gcc:调用GCC编译器,用来编译源代码。

  • -g:告诉编译器在生成的可执行文件中包含调试信息(调试符号)。

    这意味着,生成的程序会保存源码中的变量名、行号等信息,方便调试工具(如GDB)分析程序。

  • myprogram.c:源代码文件名,包含你要编译的C语言代码。

  • -o myprogram:指定输出文件的名字为myprogram,这个是编译生成的可执行文件的文件名。

  • 如果没有-o选项,默认输出文件名通常是a.out。

2.启动GDB

在终端输入:

bash 复制代码
gdb ./myprogram

进入GDB命令界面。

3.运行程序

在GDB中输入:

bash 复制代码
run

这会开始执行程序,直到遇到第一个断点或程序结束。

4.设置断点

例如,在main函数第一行:

bash 复制代码
break main

或者在某一行:

bash 复制代码
break 25

5.单步调试

  • 执行下一行:next
  • 进入函数:step
  • 继续运行直到断点:continue

6.检查变量

bash 复制代码
print variable_name

7.观察变量变化(实时显示)

bash 复制代码
display variable_name

8.程序崩溃后分析

在程序崩溃时,可以使用:

bash 复制代码
backtrace

9.退出GDB

bash 复制代码
quit

GDB常用命令汇总

命令 作用
breakb 设置断点(如:break mainb 25
run 开始执行程序
next 执行下一行(不进入函数内部)
step 执行下一行,若是函数,则进入函数内部
continue 继续执行,直到遇到下一个断点或程序结束
printp 打印变量值(如: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则像是"侦探"或"助手",在程序运行时帮助你观察和控制程序的行为,找出隐藏的问题。