温馨提示×

ubuntu c加加崩溃怎么排查

小樊
35
2026-10-19 23:40:58
栏目: 智能运维

在 Ubuntu 上排查 C/C++ 程序崩溃,通常可以按下面一套流程来定位和解决问题。


一、先确认崩溃现象

常见崩溃表现:

  • Segmentation fault (core dumped)
  • double free or corruption
  • Aborted (core dumped)
  • 程序直接退出,无提示
  • 卡死 / 死循环(不算崩溃,但常被误认为)

二、开启 Core Dump(非常重要)

1. 查看是否开启

ulimit -c

如果是 0,说明未开启。

2. 临时开启

ulimit -c unlimited

3. 运行程序产生 core 文件

./your_program

崩溃后会生成:

core
core.<pid>

路径可能受 core_pattern 影响:

cat /proc/sys/kernel/core_pattern

三、用 GDB 分析 Core 文件(最常用)

1. 安装 GDB

sudo apt install gdb

2. 加载 core 文件

gdb ./your_program core

3. 查看崩溃位置

bt

或

bt full

示例输出:

#0  0x00007f... in foo() at main.cpp:42
#1  0x00007f... in main() at main.cpp:100

重点看:

  • 哪一行代码
  • 是否访问空指针 / 越界

四、直接用 GDB 运行程序

适合必现崩溃:

gdb ./your_program
(gdb) run

崩溃后:

bt

五、编译时加调试信息(关键)

1. 加 -g

g++ -g -O0 main.cpp -o app
  • -g:调试符号
  • -O0:关闭优化(避免行号错乱)

六、常见崩溃原因 & 排查方法

1. 空指针 / 野指针

int* p = nullptr;
*p = 10;  // segfault

排查:

  • bt 看函数栈
  • print p

2. 数组越界

int a[5];
a[10] = 1;

建议:

  • 用 std::vector
  • 编译加:
-fsanitize=address

3. 内存错误(强烈推荐)

AddressSanitizer

g++ -g -fsanitize=address main.cpp -o app
./app

能直接报:

  • 越界
  • use-after-free
  • 内存泄漏

4. 多线程问题

常见:

  • 数据竞争
  • 死锁

ThreadSanitizer

g++ -g -fsanitize=thread main.cpp -o app

七、日志 & 断言

1. 打印日志

std::cout << "before func" << std::endl;

2. assert

#include <cassert>
assert(p != nullptr);

八、系统级工具(高级)

1. dmesg

dmesg | tail

可看到内核记录的程序崩溃信息。

2. strace(系统调用)

strace ./app

3. valgrind

sudo apt install valgrind
valgrind ./app

九、快速排查 checklist ✅

  • [ ] 编译加 -g -O0
  • [ ] 开启 core dump
  • [ ] gdb bt 看崩溃点
  • [ ] 用 AddressSanitizer
  • [ ] 检查指针 / 数组 / 线程

如果你愿意,可以把:

  • 崩溃信息(终端输出)
  • bt 结果
  • 相关代码

发出来,我可以直接帮你定位问题。

0 踩