温馨提示×

linux c++怎样调试程序

小樊
37
2026-09-17 06:35:39
栏目: 编程语言

在 Linux 下用 C++ 调试程序,常见且实用的方法如下,从基础到进阶逐步说明:


一、编译时准备(非常重要)

1. 加调试信息

g++ -g -O0 main.cpp -o main
  • -g:生成调试符号
  • -O0:关闭优化(否则变量可能被优化掉,调试困难)

二、使用 GDB 调试(最常用)

1. 启动 GDB

gdb ./main

2. 常用 GDB 命令

命令 作用
run / r 运行程序
break main / b 行号 设置断点
next / n 单步(不进函数)
step / s 单步(进入函数)
print x / p x 打印变量
backtrace / bt 查看调用栈
frame n 切换栈帧
continue / c 继续执行
quit / q 退出

3. 调试崩溃(Segmentation fault)

gdb ./main
run
bt

可以看到崩溃位置和调用栈。


三、Core Dump 调试(程序已退出)

1. 开启 core dump

ulimit -c unlimited

2. 运行程序产生 core

./main
# 崩溃后生成 core 文件

3. 用 GDB 分析

gdb ./main core
bt

四、日志调试(简单直接)

#include <iostream>
std::cout << "x = " << x << std::endl;

或使用日志库:

  • spdlog
  • glog
  • log4cpp

五、Valgrind(内存问题)

1. 检查内存泄漏

valgrind --leak-check=full ./main

2. 常见用途

  • 内存泄漏
  • 越界访问
  • 使用已释放内存

六、静态分析工具

  • cppcheck
cppcheck main.cpp
  • clang-tidy
clang-tidy main.cpp -- -std=c++17

七、IDE 调试(图形化)

  • VS Code + GDB
  • CLion
  • Qt Creator

八、常见调试技巧

  1. 断言
#include <cassert>
assert(ptr != nullptr);
  1. 条件断点
break main.cpp:20 if x > 10
  1. 观察点(变量变化)
watch x

九、推荐调试流程

  1. 编译加 -g -O0
  2. cout 或日志定位大致问题
  3. GDB 单步 / 断点精确定位
  4. 内存问题用 Valgrind
  5. 崩溃用 core + GDB

如果你有具体场景(如多线程、段错误、死锁、性能问题),我可以给你更针对性的调试方案。

0