0

0

C++怎么调试程序_C++调试技巧教程【高效】

冰火之心

冰火之心

发布时间:2026-02-25 14:12:11

|

200人浏览过

|

来源于php中文网

原创

gdb断点未触发需检查是否编译带-g;core dump缺失通常因ulimit -c 0或core_pattern配置异常;调试vector时避免直接print v[100],应先确认size再用迭代器访问。

c++怎么调试程序_c++调试技巧教程【高效】

gdb 断点没触发?检查编译时是否带 -g

不加 -g,gdb 就看不到变量名、行号、函数名,断点只能打在地址上,实际等于“盲调”。哪怕只用 g++ main.cpp -o app 编译,gdb 里 break main 都可能失败或跳转错行。

实操建议:

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

  • 编译命令必须包含 -g,推荐加 -O0 关闭优化(尤其涉及内联、循环展开时,-O2 下变量可能被优化掉)
  • 确认符号存在:file app 输出应含 “with debug_info”,readelf -S app | grep debug 应列出多个 .debug_*
  • 如果用 CMake,确保 set(CMAKE_BUILD_TYPE Debug) 或手动传 -DCMAKE_BUILD_TYPE=Debug

core dump 找不到?先看 ulimit -c/proc/sys/kernel/core_pattern

程序段错误后没生成 core 文件,大概率不是代码问题,而是系统限制。Linux 默认可能设 ulimit -c 0,直接禁掉 core dump;或者 core_pattern 被重定向到 /dev/null 或某个不可写路径。

实操建议:

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

  • 临时放开:运行前执行 ulimit -c unlimited(注意是当前 shell 有效)
  • 查当前 pattern:cat /proc/sys/kernel/core_pattern,常见值如 core(当前目录)、core.%e.%p(带进程名和 pid)
  • 若 pattern 是管道(如 |/usr/share/apport/apport %p %s %c %d %P),core 不会落地为文件,需改回普通路径或关掉 apport

std::vector 迭代器失效?别在 gdb 里用 print v[100] 直接访问

gdb 的表达式求值器(特别是老版本)对 STL 容器支持有限。print v[100] 看似方便,但可能触发越界访问、引发二次 crash,或返回完全错误的值——因为 gdb 并不真正走 operator[] 的边界检查逻辑,而是按内存布局硬读。

Cogniflow
Cogniflow

Cogniflow是一个无代码AISaas解决方案,允许用户创建和部署AI模型,

下载

实操建议:

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

  • 优先用 print v.size()print v.capacity() 确认范围,再用 print *(v.begin() + 100)(前提是 100
  • 启用 pretty printer:确认 ~/.gdbinit 加载了 Python 自带的 libstdc++ printers(GDB 7.7+ 默认启用,但某些嵌入式工具链可能缺失)
  • 对复杂结构体成员,避免 print obj.member.submember 连写,分步 print &obj.member 查地址更稳

多线程卡死?info threadsthread apply all bt 必须一起用

单看主线程堆栈往往看不出问题。一个线程在 pthread_mutex_lock 卡住,另一个在 malloc 里等锁,第三个刚触发 SIGSEGV——不全量看,容易误判为“主线程崩溃”。

实操建议:

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

  • 停住后第一件事:info threads 看所有线程状态(R 运行中、S 睡眠、T 已暂停),标出 ID
  • 挨个查堆栈:thread apply all bt(简写 taa bt),重点找 futex_wait__lll_lock_waitsem_wait 这类阻塞点
  • 若某线程停在 nanosleepepoll_wait,未必是问题,但若多个线程都卡在锁相关函数,基本就是死锁或资源争用

线程调度和信号处理的细节藏得很深,比如 sigwaitsignal 混用、pthread_cancel 配置不当,都可能导致 gdb 看到的线程状态和实际行为错位——这时候得结合 /proc/PID/status 里的 Statevoluntary_ctxt_switches 辅助判断。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

智谱清言 - 免费全能的AI助手
智谱清言 - 免费全能的AI助手

智谱清言 - 免费全能的AI助手

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

192

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

13

2026.02.03

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

246

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

886

2024.03.01

java中break的作用
java中break的作用

本专题整合了java中break的用法教程,阅读专题下面的文章了解更多详细内容。

120

2025.10.15

java break和continue
java break和continue

本专题整合了java break和continue的区别相关内容,阅读专题下面的文章了解更多详细内容。

260

2025.10.24

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

365

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

200

2025.07.04

batoto漫画官网入口与网页版访问指南
batoto漫画官网入口与网页版访问指南

本专题系统整理batoto漫画官方网站最新可用入口,涵盖最新官网地址、网页版登录页面及防走失访问方式说明,帮助用户快速找到batoto漫画官方平台,稳定在线阅读各类漫画内容。

55

2026.02.25

热门下载

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

精品课程

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

共94课时 | 10.1万人学习

C 教程
C 教程

共75课时 | 4.9万人学习

C++教程
C++教程

共115课时 | 19.2万人学习

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

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