C++调试技巧总结

news2024/11/16 17:46:27

1.调试准备

  • 常用调试

  • Crash调试

调试信息:
Windows系统:符号单独PDB文件/链接时生成,从外部的符号服务器下载。(微软)
LInux: 调试符号与目标模块在一个文件内,编译时产生调试信息。模块发布时剥离调试信息,减小大小

转储文件:进程的内存镜像,存储程序的执行状态

2.调试基础知识

  • PDB介绍 (Program DataBase)

构建应用时,生成的用于调试的符号文件。
没有符号文件及模块文件,目标文件(二进制文件)就无法知道这些数据代表的变量,函数。
私有符号,公有符号。名字有点歧义,公有符号是私有符号的子集。
VS一般生成的是私有符号,可以从私有符号中剥离出来公有符号文件。

  • PDB文件加载

符号以模块为单位加载,加载时搜索顺序为:
1. 目标文件所在的目录;
2. 目标文件中构建时绝对路径,如C:\xxx\abc*.pdb;
3. 根据symbol server的设置,在本地的symbol server的cache中查找
4. 远程的symbol server中查找

  • 生成PDB文件生成

(1)指定调试信息格式,设置为/Zi或/ZI时会生成PDB文件:
Project -> Properites -> Configuration Properties -> C/C++ -> General -> Debug Information Format

(2)指定连接器(Linker)是否生成调试信息,YES为生成,NO为不生成。
Project -> Properites -> Configuration Properties -> Linker -> Debugging -> Generate Debug Info

说明:Debug模式下自动生成PDB,Release模式下需手动配置。(Disabld(/Od)编译优化可以去掉)。

  • Dump文件简介:

Winidows memory dump file,内存转储文件

MiniDump包含信息:线程,模块,系统信息等

怎么生成:线程,模块,系统信息

  1. 调用API生成。 一般进程中有未处理的异常Crash,可调用MiniDumpWriteDumpAPI生成
  2. 任务管理器--》 进程--》创建转储文件
  3. VS调试状态下,调试页签-》将转储另存为
  4. 其他工具 Windbg, Process Explorer
  • 常用调试工具

3.常用调试手段

4.调试断点介绍

  • 断点管理:

        新建,删除,启用,禁用,查看断点,导入,导出,断点状态

  • 断点类型:

        普通断点
        条件断点
        数据断点
        函数断点

说明:
断点是为了满足调试设置的特殊标记,一般为中断运行,方便可以查看运行状态,数据。
白色小圆圈外加一个惊叹号断点,可能模块未在调试状态,可能是因为源码对应的PDB没有成功加载。断点标签方便管理断点。

  • 条件断点

筛选器+条件表式达中断

设置“条件表达式”, 在不中断的运行的情况下,查看数据

命中次数

  • 数据断点

数据断点+条件表达式

  • 函数断点

5.调试执行

6.变量查看

7.调用堆栈

说明:
显示外部代码有时在分析Dump文件时,发现堆栈展不开,可以右键显示外部代码试下。

8.提示技巧

  • 函数返回值: 当代码逐行通过调试器时,自动窗体显示上一行函数调用的返回值。

应用场景: 无需跟到函数内部看返回值,一行代码有多个函数调用。

  • 固定提示数据

  • 更改执行流

  • 异常发生与处理经常代码相聚比较远,捕获异常发生,在实际应用中排查问题比较快捷

  • 异常后发生,可以观察调试窗口输出,一般有输出的打印信息

  • 监视窗口中查看错误码

如果调用WindowsAPI失败后,可以通过GetLastError查看错误码。
通过Watch窗口查看:输入GetLastError返回错误码,使用工具-》查找错误码,查看错误原因
输入err查看错误码, 或者err,hr查看错误原因。

  • 模块窗体中查看符号加载情况

调试时,通过选择“调试”>“窗口”>“模块”来打开“模块”窗口。
“模块”窗口可以告诉你调试器将哪些模块视为用户代码或我的代码,以及模块的符号加载状态 可以直接在 模块 窗口中右键单击并选择 加载符号 来加载符号信息。

  • 符号加载设置

一般默认不勾选“微软符号服务器”, 调试下载PDB比较慢 设置PDB路径,或者PDB服务器。

  • 转储文件分析

(1)打开转储文件

(2)搜索.exe文件路径

(3)查找.exe,.pdb和源文件

9.参考资料

  • https://docs.microsoft.com/zh-cn/visualstudio/debugger/edit-and-continue-visual-cpp?view=vs-2019
  • https://devblogs.microsoft.com/cppblog/debugging-tips-and-tricks-for-c-in-visual-studio/
  • Windbg帮助手册
  • 软件调试之道
  • 调试软件
  • C/C++代码调试艺术
  • 程序员的自我修养

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1860771.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OurBMC大咖说丨第5期:BMC开发中的非标准化问题探讨

栏目介绍:"OurBMC大咖说" 是由 OurBMC 社区精心策划的线上讲座栏目,邀请 BMC 相关领域大咖共同探讨 BMC 全栈技术的发展趋势、挑战和机遇。无论你是初学者还是资深从业者,"OurBMC大咖说" 都将为你提供一个宝贵的学习和交…

MobileViT v3 论文解读

paper:MobileViTv3: Mobile-Friendly Vision Transformer with Simple and Effective Fusion of Local, Global and Input Features official implementation:GitHub - micronDLA/MobileViTv3 出发点 MobileViT v1通过结合CNN和ViT的优势,…

用户是如何访问网站的?

由于IP地址不方便记忆并且不能显示地址组织的名称和性质,人们设计出了域名,并通过域名系统(DNS,Domain Name System)来将域名和IP地址相互映射,使人更方便地访问互联网,而不用去记住能够被机器直…

数字心动+华为运动健康服务 使用体验指导

一、应用介绍 “数字心动”是一个体育生态平台APP,践行“体育大健康娱乐数字营销”模式,打造深度融合体育平台。APP集跑步运动记录、赛事活动报名、成绩/大众等级证书查询等多功能于一体,采取“线上线下”模式,结合协会、行业、品…

安泰电压放大器有什么作用

电压放大器是一种电子器件,它能够将输入信号的电压增大到所需的输出电压水平。电压放大器在电子电路设计中起到了至关重要的作用,下面将详细介绍电压放大器的作用。 信号放大作用:电压放大器主要作用是放大输入信号的电压,使其具有…

vue3组件通讯-介绍

简介 Vue 3 引入了多种强大的功能和改进,其中包括增强的组件通信机制。了解这些机制对于构建复杂、可维护的应用程序至关重要。下面,我们将介绍在 Vue 3 中组件通信的几种方法。 通讯类型 父子组件通信上下级通信(不仅父子级)兄…

什么牌子的开放式耳机性价比高?2024超靠谱品牌推荐!

开放式耳机最近几年已经成为音乐爱好者们的一个新的选择。它们从最初的基本音质发展到了现在的高解析度,不断的升级。这类耳机开放式、安全的性能和舒适的佩戴体验,无论你是在街上漫步还是在家中享受安静的时光,都能够得到很好的体验。在众多…

Go语言之控制结构

个人网站: http://hardyfish.top/ 免费书籍分享: 资料链接:https://url81.ctfile.com/d/57345181-61545511-81795b?p3899 访问密码:3899 免费专栏分享: 资料链接:https://url81.ctfile.com/d/57345181-6…

HarmonyOS Next开发学习手册——通过startAbilityByType拉起垂类应用

使用场景 开发者可通过特定的业务类型如导航、金融等,调用startAbilityByType接口拉起对应的垂域面板,该面板将展示目标方接入的垂域应用,由用户选择打开指定应用以实现相应的垂类意图。垂域面板为调用方提供统一的安全、可信的目标方应用&a…

Qt-Advanced-Docking-System示例程序

写了一些简单的示例程序,帮助我更好地使用和了解Qt-Advanced-Docking-System 1.写一个如图页面布局的程序 m_pDockMangernew ads::CDockManager(this);this->setCentralWidget(m_pDockManger);ads::CDockWidget* centerDockWidgetnew ads::CDockWidget("中…

MinIO下载和安装(Windows)

1、MinIO下载和安装 | 用于创建高性能对象存储的代码和下载内容 2、在本地硬盘中并新建一个minio文件夹 里面再创建bin文件夹和data文件夹 bin 用于存放下载的minio.exe data 用于存放数据 logs 用于存放日志 3、 编写启动脚本start.bat echo off echo [信息] 运行MinIO文服务…

探索新质生产力,Coremail邮件新品系列重磅发布!

数字化发展至今,新一轮科技革命与产业变革加速推进,利用新质生产力成为企业发展的关键,而邮箱作为日常工作的重要软件应用,如何紧追时代风口助力行业革新? 6月20日,探索新质生产力:Coremail智能…

自动化IC封装模拟分析工作流程

在IC封装制程的制程模拟中,为了同时提升工作效率与质量,CAE团队常会面临到许多挑战。在一般的CAE分析流程中,仿真分析产生结构性网格,是非常繁琐且相当花时间的。必须要先汇入2D (或3D) 图档,接着陆续建立表面网格、高…

华为升腾显卡选型备忘

目录 1. 开发套件 2. 加速模块 3. 加速卡 4. 训练卡 官方地址:https://www.hiascend.com/ 备注: (1)V后缀的都是Video视频解析卡,本质是推理卡; (2)I后缀的都是推理卡&#…

Ubuntu server 22.04 (Linux) 安装部署 redis 7.4 详细步骤 Tab 不能自动补全

1 安装依赖软件 sudo apt update sudo apt-get install tcl-dev 2 下载 wget https://download.redis.io/releases/redis-7.4-rc1.tar.gz 3 编译安装 #解压 tar zxvf redis-7.4-rc1.tar.gz # cd redis-7.4-rc1/ #编译 make make test #安装 sudo make install PREFIX/usr…

防爆气象站的工作原理

TH-FBCQX2防爆气象监测设备是为了在存在爆炸性气体或粉尘的潜在危险环境中进行气象监测而专门设计的设备。以下是对防爆气象监测设备的详细介绍: 防爆气象监测设备符合防爆安全标准,确保在易燃易爆环境中不会产生火花或热源,从而避免引发爆炸…

IDEA2024关闭自动AI代码补全功能

文章目录 一、背景二、教程四、写在后面 一、背景 在本人前段时间的一次面试算法题中,面试官让我关闭代码提示功能,当时气氛尴尬的可以抠出三室一厅,但是这个功能是2024新版参考文献自带的,本次来分享如何关闭新版代码补全功能。…

Model3C芯片方案--86彩屏中控面板Modbus协议说明

一、概述 Model3C芯片是一款基于RISC-V的高性能、国产自主、工业级高清显示与智能控制MCU,配备强大的2D图形加速处理器、PNG/JPEG解码引擎,并支持工业宽温。基于Model3C芯片的86彩屏中控面板,通过集成Modbus协议,实现了与多种控制…

一键登录功能实现(采用极光SDK)

前端流程 1. 引入极光认证 SDK&#xff1a; 通过 <script> 标签引入 &#xff0c;在 public/index.html 中确认 SDK 脚本已正确加载&#xff1a;参考官网Web SDK 概述 - 极光文档 <!-- 引入极光认证 SDK --> <script type"text/javascript" src&qu…

three.js - 置换贴图(displacementMap)、凹凸贴图(bumpMap)

这就是个灰度图 瞅瞅下面的贴图们&#xff0c;加深一下印象吧 说一下灰度图 在灰度图中&#xff0c; 黑色&#xff1a;代表最低的深度&#xff08;或最低的置换&#xff09; 白色&#xff1a;代表最高的深度&#xff08;或最高的置换&#xff09; 中间的灰度值&#xff0c;则…