Contents

Gdb Gcc CMake

摘要 简单使用gdb gcc cmake。

关键词 gdb, coredump, gcc, cmake

1. gdb

  • 权限问题:如果目标进程需要 root 权限,确保以 root 用户运行 GDB。
  • 调试符号:如果可执行文件没有调试符号(未使用 -g 编译),堆栈信息可能不完整。

启动

# -g 编译,表示可以debug
g++ -g test.cpp -o test 

# gdb 调试二进制文件
gdb test
或 gdb -q test //表示不打印gdb版本信息,比较干净
break(b)main.main #在main包里的main函数入口打断点
continue(c) #继续运行,直到断点处停止

# 用gdb -args 给二进制文件添加启动参数,并监控
gdb --args ./test -c 100

# 监听进程
gdb attach <pid> 
或者 gdb -p <pid> 
hanle SIGPIPE nostop
c

# 调试 core 文件
gdb ./可执行文件 core

常用命令

run # 开始运行
step # 单步执行,会进入函数
next # 单步执行,不进入函数
continue # 继续执行
finish # 完成执行,从当前函数返回
quit # 退出gdb

break 文件名:行号 # 设置断点
info breakpoints # 查看断点信息
delete <断点编号> # 删除断点,如果不指定断点编号会删除所有断点
disable <断点编号> # 停用断点
enable <断点编号> # 启用断点

list # 显示代码
list <函数名> # 显示指定函数的代码
print <变量名> # 打印变量值
ptype <变量名> # 打印变量类型
x/<格式> <地址> # 查看内存

info registers # 查看寄存器信息
info threads # 查看所有线程的信息
info frame # 查看当前栈帧详细信息
info locals # 显示当前栈帧中的所有局部变量及其值
info args  # 显示当前栈帧中的函数参数及其值
info signals # 列出所有信号及其处理方式

backtrace # bt 打印崩溃堆栈

打印所有线程的堆栈信息,保存到文件

# 多线程程序
set logging enabled on
thread apply all bt # 打印所有线程的堆栈信息
set logging file gdb_log.txt
set logging enabled of

2. core dump

  • 查看是否支持core dump
  • 通过 /proc/sys/kernel/core_pattern 控制 core 文件的生成路径和命名规则
ulimit -a

ulimit -c
# 如果返回 0,则不支持,可通过 ulimit -c unlimited 来修改
# 如果返回 unlimited,则支持,且大小无限

3. gcc/g++

# (1)预处理(Preprocessing)。由预处理器cpp完成,将.cpp源文件预处理为.i文件。
g++  -E  test.cpp  -o  test.i    # 生成预处理后的.i文件
# (2)编译(Compilation)。由编译器cc1plus完成,将.i文件编译为.s的汇编文件。
# 使用-S选项,只进行编译而不进行汇编,生成汇编代码。
g++ -S test.i -o test.s                        # 生成汇编.s文件
# (3)汇编(Assembly)。由汇编器as完成,将.s文件汇编成.o的二进制目标文件
g++  -c  test.s  -o  test.o    # 生成二进制.o文件
# (4)链接(Linking)。由链接器ld,将.o文件连接生成可执行程序。
g++ test.o  -o  test.out            # 生成二进制.out可执行文件

# 生成可执行文件
g++ -o hello hello.cpp

# 生成动态链接库
g++ -fPIC -shared -o libexample.so example.cpp

功能参数

  • -I 头文件搜索路径
  • -L 库文件搜索路径
  • -lpthread 搜索库文件pthread
  • -g debug模式,gdb会有更详细信息
  • -std=c++11 告诉编译器使用 C++11 标准。

4. CMake

参考:CMake 快速入坑 - 博客

编写 CMakeLists.txt

cmake_minimum_required(VERSION 3.0.0)
project(hello)
add_executable(hello main.cpp)

执行

mkdir build && cd build
cmake ../ # 生成 makefile
cmake --build . # 构建可执行文件
或者直接 make .