0

0

c++中segmentation fault怎么调试_c++段错误解决方法【经验】

尼克

尼克

发布时间:2026-01-28 11:57:57

|

834人浏览过

|

来源于php中文网

原创

用gdb加载core文件或直接调试可定位段错误位置;编译需加-g,常见原因包括空指针解引用、数组越界、使用已释放内存、栈溢出及多线程竞态;AddressSanitizer能主动检测越界和野指针。

c++中segmentation fault怎么调试_c++段错误解决方法【经验】

怎么看 segmentation fault 发生在哪儿

Linux 下运行程序直接报 Segmentation fault (core dumped),但没行号、没调用,等于盲人摸象。先别急着改代码,用 gdb 把 core 文件载入:确保系统允许生成 core(ulimit -c unlimited),运行出错后执行 gdb ./a.out core,进 gdb 后输 bt(backtrace)——90% 的情况能立刻看到崩溃在哪个函数、哪一行。

如果没 core 文件,或者想实时观察,直接 gdb ./a.out 启动,再用 run 运行;崩溃后同样 bt。注意:编译时务必加 -g,否则堆栈里全是 ??:?

常见触发点和对应检查项

段错误本质是访问了非法内存地址,不是语法错,所以编译器不报错。高频场景有这几类:

  • nullptr 解引用:比如 p->data 前没检查 p 是否为 nullptr
  • 数组越界:arr[10] 定义了 10 个元素(索引 0~9),却访问 arr[10]arr[-1]
  • 使用已释放内存:调用 delete p 后继续用 *pp->func()
  • 栈溢出:局部数组过大(如 char buf[1024*1024]),或递归过深
  • 多线程竞态:一个线程 delete 了对象,另一个线程还在访问其成员

用 AddressSanitizer 快速定位野指针和越界

比 gdb 更主动的手段是编译时加 -fsanitize=address -g,例如:g++ -fsanitize=address -g main.cpp。运行时报错会直接指出哪行越界、哪个指针已释放、甚至堆块分配/释放的完整上下文,信息密度远超 gdb bt

立即学习C++免费学习笔记(深入)”;

奇布塔
奇布塔

基于AI生成技术的一站式有声绘本创作平台

下载

注意两点:

  • ASan 仅支持 Linux/macOS,Windows 上得用 Visual Studio 的诊断工具或 Dr. Memory
  • 开启 ASan 后程序变慢、内存占用翻倍,只用于调试,不要带到生产环境

std::vector 和智能指针能防住哪些段错误

它们不能杜绝段错误,但能大幅减少人为失误:

  • std::vector::at() 会做边界检查并抛 std::out_of_range 异常;而 operator[] 不检查,行为同原生数组
  • std::unique_ptrstd::shared_ptr 管理生命周期,避免“释放后使用”,但无法防止 reset() 后仍用原始指针副本
  • 别写 std::shared_ptr(new T),要用 std::make_shared(),否则可能因异常导致内存泄漏+后续访问失效内存

真正容易被忽略的是:容器迭代器失效后继续解引用(如 vec.erase(it) 后还用 *it),这不会被 ASan 捕获,gdb 里看到的崩溃点往往是下游函数,要逆向查容器操作历史。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

395

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

575

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

395

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

575

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

502

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

166

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

10

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

14

2026.01.21

php中文乱码如何解决
php中文乱码如何解决

本文整理了php中文乱码如何解决及解决方法,阅读节专题下面的文章了解更多详细内容。

1

2026.01.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.9万人学习

Git 教程
Git 教程

共21课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号