#部分转载知乎文章详解C/C++代码的预处理、编译、汇编、链接全过程 - 知乎
#just for方便管理
1 什么是GCC、GNU、gcc与g++
- GNU:一个操作系统,具体内容不重要
- GCC:GNU Compiler Collection(GNU编译器集合)的缩写,可以理解为一组GNU操作系统中的编译器集合,可以用于编译C、C++、Java、Go、Fortan、Pascal、Objective-C等语言。
- gcc:GCC(编译器集合)中的GNU C Compiler(C 编译器)
- g++:GCC(编译器集合)中的GNU C++ Compiler(C++ 编译器)
注意:简单来说,gcc调用了GCC中的C Compiler,而g++调用了GCC中的C++ Compiler。 - 对于 *.c
和 *.cpp
文件,gcc分别当作 c 和 cpp文件编译,而g++则统一当作cpp文件编译。
2. 代码编译命令
gcc/g++常用指令选项:
3.GDB
GDB(gdb)全称“GNU symbolic debugger”,是 Linux 下常用的程序调试器。
通过详解C/C++代码的预处理、编译、汇编、链接全过程 - 知乎我们可以监控程序执行的每一个细节,包括变量的值、函数的调用过程、内存中数据、线程的调度等,从而发现隐藏的错误或者低效的代码,程序的调试过程主要有:单步执行,跳入函数,跳出函数,设置断点,设置观察点,查看变量。
3.1 为了能够使用 gdb 调试,需要在代码编译的时候加上-g
g++ -g -o test test.cpp
3.2 调试过程介绍
3.2.1 编译程序加参数时生成调试信息
3.2.2 gdb常用调试命令
3.2.2.1 启动与退出
- 启动:
gdb 可执行程序
- 退出:
quit/q
3.2.2.2 给程序设置参数/获取设置参数
- 设置参数:
set args 10 20
- 获取设置参数:
show args
3.2.2.3 查看当前文件代码
- 从默认位置显示:
list/l //list或小写的L
- 从指定的行显示:
list/l 行号 //此行号在显示的上下文中间位置
- 从指定的函数显示:
list/l 函数名
3.2.2.4 查看非当前文件代码
- 编译运行并使用
gdb main
- 从指定文件指定的行显示:
list/l 文件名:行号
- 从指定文件指定的函数显示:
list/l 文件名:函数名
3.2.2.5 查看及设置显示的行数
- 查看显示的行数:
show list/listsize
- 设置显示的行数:
set list/listsize
3.2.2.6 断点操作
-
查看断点:
i/info b/break
-
设置一般断点
b/break 行号
b/break 函数名
b/break 文件名:行号
b/break 文件名:函数
-
设置条件断点(一般用在循环的位置):
b/break 10 if i== 5
- 删除断点:
d/del/delete 断点编号
- 设置断点无效:
dis/disable 断点编号
- 设置断点生效:
ena/enable 断点编号
3.2.2.7 调试操作
- 运行
GDB
程序- 程序停在第一行:
start
- 遇到断点才停:
run
- 程序停在第一行:
- 继续运行,到下一个断点停:
c/continue
- 向下执行一行代码(不会进入函数体):
n/next
- 变量操作
- 打印变量值:
p/print 变量名
- 打印变量类型:
ptype 变量名
- 打印变量值:
- 向下单步调试(遇到函数进入函数体)
s/step
- 跳出函数体:
finish
- 自动变量操作
- 自动打印指定变量的值:
display 变量名
- 查看自动变量:
i/info display
- 取消自动变量:
undisplay 编号
- 自动打印指定变量的值:
- 其它操作
- 设置变量值:
set var 变量名=变量值 (循环中用的较多)
- 跳出循环:
until
- 设置变量值: