[GDB] 使用 GDB 调试程序崩溃
1 GDB 简介
GDB(GNU Debugger)是UNIX及UNIX-like下的强大调试工具,可以调试ada, c, c++, asm, minimal, d, fortran, objective-c, go, java,pascal等语言。
它的官网地址:
https://www.gnu.org/software/gdb/
2 GDB 安装
通常 Ubuntu 系统都会预装某个版本的 GDB,如果没有或者想要安装新版可以使用如下命令:
1 2 | sudo apt-get update sudo apt-get install gdb |
或者在官网下载新版源码编译安装。
3 GDB 命令行使用
可以用如下 main.cpp 来实验崩溃的调试过程:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <stdio.h> int func(int *p) { *p = 0; } int main(int argc,char *argv[]) { func(NULL); if (argc <= 1) printf("Hello World!\n"); else printf("Hello %s!\n",argv[1]); return 0; } |
3.1 GDB 编译参数
使用 GDB 需要在编译时加入 -g 参数。例如:
命令行的方式:
1 | gcc -o main -g main.cpp |
CMake 的方式:在 CMakeLists.txt 中加入类似如下参数:
1 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g") |
完整 CMakeLists.txt 示例如下:
1 2 3 4 5 6 7 | cmake_minimum_required(VERSION 3.20) project(main) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g") SET(CMAKE_BUILD_TYPE "Release") set(CMAKE_CXX_STANDARD 11) add_executable(main main.cpp) |
3.2 GDB 崩溃调试
一个简单步骤如下:
1)编译文件
使用 gcc 的话:
1 | gcc -o main -g main.cpp |
使用 CMake 的话:
1 2 3 4 | mkdir build cd build cmake .. make |
编译出的可执行文件为 main。
2)装载 main
运行命令:
1 | gdb main |
3)运行 main
运行包含无参数和有参数运行两种方式,命令如下:
无参数运行方式,运行:
1 | run |
有参数运行方式,运行:
1 | run Xiao |
或者使用 set args 命令:
1 2 | set args Xiao run |
如果顺利的话可能直接显示出崩溃的代码位置,例如:
当然也可以查看 back trace。
4)查看 back trace
运行命令:
1 | bt |
提示崩溃在第 10 行,对应代码就是:
1 | func(NULL); |
5)关闭 GDB
运行:
1 | q |
参考材料
[1] https://www.yanbinghu.com/2019/04/20/41283.html
[2] https://www.jianshu.com/p/4da57a8aa0aa
[3] https://blog.csdn.net/tekenuo/article/details/88394780
[4] https://www.gnu.org/software/gdb/documentation/