文章目录
- 1. 编译过程
- 2. g++重要参数
- 3、生成库文件
- 3.1 静态库
- 3.2 动态库
- 4. gdb调试
- gdb 常用命令示例
- frame:查看栈帧
- info:查看调试信息
- display:自动显示表达式
- set:修改变量与环境
- thread
1. 编译过程
| 步骤 | 作用 | 命令 |
|---|---|---|
| 预处理 | 宏展开,头文件包含 | g++ -E test.cpp -o test.i |
| 编译 | 生成汇编语句代码 | g++ -S test.i -o test.s |
| 汇编 | 生成机器语言代码 | g++ -c test.s -o test.o |
| 链接 | 生成可执行文件 | g++ test.o -o test.exe |
2. g++重要参数
| 参数 | 作用 | 命令 |
|---|---|---|
| -g | 可被gdb调试 | g++ -g test.cpp -o test.exe |
| -O[n] | 代码优化 | g++ -O2 test.cpp -o test.exe |
-l | 指定动静态库文件 | g++ -lglog test.cpp -o test.exe |
| -L | 指定动静态库文件路径 | g++ -L/home/lzg -lmytest test.cpp -o test.exe |
| -Wall | 打印告警信息 | g++ -Wall test.cpp -o test.exe |
| -w | 关闭告警信息 | g++ -w test.cpp -o test.exe |
| -std=c++11 | 指定编译标准 | g++ -std=c++11 test.cpp -o test.exe |
| -D | 指定宏名 | g++ -DV5PLAT test.cpp -o test.exe |
-I | 指定include文件路径 | g++ -DV5PLAT test.cpp -o test.exe |
3、生成库文件
3.1 静态库
1.生成二进制文件 g++-c swap.cpp-o swap.o-I../include 2.归档为静态库 ar rs libSwap.a swap.o 3.利用静态库编译main g++main.cpp-lSwap-Lsrc-Iinclued-o main.exe 4.运行可执行文件./main.exe需要说明:
1、-Lsrc是为了执行静态库文件的路径,而不是指定源代码路径
2、-lSwap链接静态库时不要把完整静态库名称(lib*.a)写进来
3.2 动态库
1.生成二进制文件 g++-c swap.cpp-I../include-fPIC-shared-o libSwap.so 2.归档为静态库 ar rs libSwap.a swap.o 3.利用静态库编译main g++main.cpp-lSwap-Lsrc-Iinclued-o main.exe 4.运行可执行文件 LD_LIBRARY_PATH=src./main.exe需要注明动态库路径.
4. gdb调试
gdb调试需要在编译时加入-g参数,才能支持gdb调试.
gdb file ctrl-x ctrl-a 或: gdbtui filegdb 常用命令示例
下面分别说明frame、info、display、set的用法。
frame:查看栈帧
frame用于查看或切换当前调用栈帧。典型场景:程序在某个函数里崩溃或断点停下时,先用bt查看完整调用栈,再用frame 0、frame 1等切换到不同层级,逐层检查各函数的参数和局部变量,从而定位问题发生在哪一层调用。
(gdb)frame# 查看当前栈帧(gdb)frame0# 切换到第 0 帧(gdb)bt# 查看完整调用栈(backtrace)info:查看调试信息
info与不同子命令搭配,可查看断点、局部变量、寄存器、线程等信息。典型场景:进入调试后先执行info breakpoints确认断点位置;程序停在断点处时执行info locals查看局部变量排查逻辑问题;排查空指针、越界等底层问题时用info registers查看寄存器内容;多线程程序则用info threads确认各线程状态。
(gdb)info breakpoints# 查看断点信息(gdb)info locals# 查看当前栈帧的局部变量(gdb)info registers# 查看寄存器内容(gdb)info threads# 查看所有线程(gdb)info variables# 查看全局变量display:自动显示表达式
display会在程序每次暂停时自动打印指定表达式的值。典型场景:在单步跟踪循环或递归调用时,不用每次手动print,把关键变量加入 display 后,每执行一步停下都会自动显示它的最新值,便于观察变量随迭代的变化规律。
(gdb)display a# 每次停下自动显示变量 a(gdb)display/x a# 以十六进制格式每次自动显示变量 a(gdb)info display# 查看自动显示列表(gdb)delete display1# 删除编号为 1 的自动显示项set:修改变量与环境
set用于修改变量值、设置程序参数或环境变量等。典型场景:怀疑某个变量的错误取值导致 bug 时,可用set var临时改值后继续运行验证;程序需要命令行参数时先用set args指定参数再run;运行依赖动态库的程序时,可先通过set environment LD_LIBRARY_PATH=...指定动态库路径。
(gdb)setvar a=10# 修改变量 a 的值(gdb)setargs123# 设置程序运行参数(gdb)setenvironmentLD_LIBRARY_PATH=./src# 设置环境变量thread
(gdb)info threads # 查看所有线程,*表示当前线程(gdb)thread2# 切换到线程2(gdb)bt # 查看该线程的调用栈(gdb)info locals # 查看该线程当前栈帧的局部变量(gdb)print var # 打印该线程上下文里的变量 # 如果不切换过去可以使用threadapply(gdb)thread apply all bt # 所有线程的调用栈(gdb)thread apply23bt # 只看线程2、3的栈(gdb)thread apply all print x # 所有线程里的变量 x