VC++ 利用PDB和dump文件定位问题并进行调试
转载:https://blog.csdn.net/zfs_kuai/article/details/43646665
转载:https://blog.csdn.net/i_chaoren/article/details/81453142
一、什么是PDB文件
1. PDB文件是"程序数据库" Program Data Base的简称,包含的程序的代码信息
2.通过这个文件我们可以查看对应断电的位置,堆栈信息等内容
3.使用PDB使得我们无需代码也可以掌握程序的堆栈运行状态
二、PDB文件
1.由链接器自动生成
2.文件由两部分构成,私有符号数据(private symbol data )和 公共符号表(public symbol data)
私有符号数据(Private Symbol Data)
函数
全局变量
局部变量
用户定义的结构体,类,数据类型
源文件的名称和源文件中每个二进制指令的行号
公共符号表(Public Symbol Table)
静态变量
全局变量(external)
三、如何得到PDB文件
程序编译之后会在Debug或者是Release目录下生成*.pdb文件
四、什么是dump文件
dump文件是附加堆栈信息的存储文件的简称,文件扩展名“.dmp”,通过dump文件我们可以得到程序运行某一时刻的堆栈数据。
当我们程序意外崩溃后,通常程序会立即中断运行,此时我们生成这一时刻的dump文件就可以通过此时的堆栈进行分析,找到崩溃的代码并分析原因。
当程序遇到未处理异常(主要指非指针造成)导致程序崩溃死,如果在异常发生之前调用了SetUnhandledExceptionFilter()函数,异常交给函数处理。
MSDN中描述为:
Issuing SetUnhandledExceptionFilter replaces the existing top-level exception filter for all existing and all future threads in the calling process.
因而,在程序开始处增加SetUnhandledExceptionFilter()函数,并在函数中利用适当的方法生成Dump文件,即可实现需要的功能。
Dump文件是进程的内存镜像。可以把程序的执行状态通过调试器保存到dump文件中。
五、EXE、DLL等与pdb文件的匹配
调试器是如何来判别EXE、DLL等是否和一个pdb文件匹配呢?
每次我们链接EXE或者DLL或者SYS的时候,链接器都将产生一个唯一的GUID,然后将其写入到PDB和可执行文件。调试器加载的时候将检查两者的GUID,如果一致就表示他们匹配。
注:如果我们需要调试,我们需要查dmp文件,那么请妥善保管好自己的代码和pdb。每次重新编译,即使所有代码均没有变化,他们的GUID也不同。
六、编译器产生符号的过程
如果指定生成调试信息,编译器在每次编译完文件以后就会产生一个obj文件,然后同时产生它对应的调试信息。当我们进行连接的时候,编译器就会帮我们把所有obj统一编译为一个可执行文件,然后所有的调试信息统一生成一个PDB文件。
七、Release程序生成pdb文件
用VS调试Release的程序,发现无法调试。其实,并不是Release的程序不能调试,而是没有让Release的程序生成pdb文件,VS无法加载pdb文件而无法调试程序。
设置一下,让Release的程序也生成pdb文件,就好了。

八、本地dump调试
直接用VS打开Test.dmp文件,测试时dmp文件是本地产生的,因此VS会依据dmp文件自行找到exe,pdb和源代码的路径。因此直接点击调试,程序会出错代码行中断


十、无源代码dump调试
但若dmp文件是exe在另一台机器上产生的,则我们最好把exe,pdb,dmp放到同一文件夹下,必须保证pdb与出问题的exe是同一时间生成的,用VS打开dmp文件后还需要设置符号表文件路径和源代码路径。
(1)当把pdb文件与dmp文件放入同一目录下时,就不需设置其路径,否则需要设置
工具->选项->调试->符号:

(2)还需设置源代码路径:
属性->调试源代码:

这样点击“使用仅限本机进行调试”,即可在出错代码行中断:
WinDbg调试
基本思路与VS一致,winDbg会提供更为全面的调试信息
(1)设置pdb路径:File ->Symbol File Path
(2)设置exe路径:File -> Image File Path
(3)设置源代码路径:File -> Source File Path(指sln所在目录)
(4)打开dmp文件:File ->Open Crash Dump
(5)执行命令 !analyze –v
可以得出详细的异常分析

VC++ 利用PDB和dump文件定位问题并进行调试的更多相关文章
- 利用VS2005进行dump文件调试
前言:利用drwtsn32或NTSD进行程序崩溃处理,都可以生成可用于调试的dmp格式文件.使用VS2005打开生成的DMP文件,能很方便的找出BUG所在位置.本文将讨论以下内容: 1. 程序编译选 ...
- 利用VS2005进行dump文件调试(17篇博客)
前言:利用drwtsn32或NTSD进行程序崩溃处理,都可以生成可用于调试的dmp格式文件.使用VS2005打开生成的DMP文件,能很方便的找出BUG所在位置.本文将讨论以下内容: 1. 程序编译选 ...
- mac下利用Breakpad的dump文件进行调试
一.前情回顾 最近把公司的一个视频处理程序更新了一个版本,准备提交测试的发现了崩溃的情况.这个程序采用Qt和ffmpeg技术栈开发,主要用于对视频进行渲染拼接处理,在Windows和mac两个平台同时 ...
- Windows平台dump文件的产生,调试;工程配置pdb文件怎么生成
http://blog.csdn.net/byxdaz/article/details/25872151
- Dump文件的生成和使用
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/lk142500/article/detai ...
- 如何使用dump文件进行调试
转载[文尾出处链接] 1 简介第一次遇到程序崩溃的问题,之前为单位开发了一个插件程序,在本机运行没有出现问题,但把生成的可执行文件拷贝到服务器上一运行程序,刚进入插件代码,插件服务就崩溃了,当时被这个 ...
- windows下dump文件调试
dump调试:在系统中异常或者崩溃的时候,来生成dump文件,然后用调试器来调试.这样就可以在生产环境中的dmp文件,拷贝到自己的开发机器上,调试就可以找到错误的位置,配合程序调试符号pdb文件,直接 ...
- 记一次dump文件分析历程
一.背景 今天下午,正酣畅淋漓的搬砖,突然运维同事在群里通知,核心服务某个节点内存异常,服务假死.神经一下子紧张起来,赶紧跑到运维那边观察现象. 观察的结果是服务内存溢出,该服务是核心服务,分配了5G ...
- Windows下利用Windbg 分析dump
概述: 注册生成dump文件的函数. 当程序收到没有捕获的异常时,调用上述函数,生成dump文件. 利用Windbg结合编译程序时生成的pdb和代码来分析dump文件,定位问题. 如下代码生成dump ...
随机推荐
- HDU 3306 Another kind of Fibonacci(矩阵+ll超时必须用int&输入必须取模&M必须是int类型)
Another kind of Fibonacci [题目链接]Another kind of Fibonacci [题目类型]矩阵+ll超时必须用int&输入必须取模&M必须是int ...
- 第一章 JS基础
1.JavaScript的作用:表单验证,减轻服务器压力动态效果动态改变页面内容 2.JavaScript的组成ECMAScript语法规定BOM对象模型(浏览器对象模型)DOM对象模型(文档对象模型 ...
- Mysql导出(多张表)表结构及表数据 mysqldump用法
命令行下具体用法如下: mysqldump -u用戶名 -p密码 -d 數據库名 表名 脚本名; 1.导出數據库為dbname的表结构(其中用戶名為root,密码為dbpasswd,生成的脚 ...
- mariadb中创建外键时的一个奇怪的情况
在建表语句中,将参照的定义放到对应的属性后面,类似于这样: create table tbl2 (id int references tbl1(id)); 发现并没有成功创建外键. 而将参照的定义放到 ...
- caffe训练脚本文件时遇到./build/tools/caffe: not found
原文转载:https://blog.csdn.net/zhongshaoyy/article/details/53502373 cifar10训练步骤如下: (1)打开终端,应用cd切换路径,如 cd ...
- Excel的导入导出功能
POI组件的详细介绍文档: https://www.cnblogs.com/huajiezh/p/5467821.html .xls 对应 HSSFWorkbook book=new HSSFWork ...
- os.system
python os.system os.system()函数在不同的系统下可以实现不同的作用 一.window下: os.system("ping www.baidu.com" ...
- 【转】C#中base关键字的几种用法
base其实最大的使用地方在面相对性开发的多态性上,base可以完成创建派生类实例时调用其基类构造函数或者调用基类上已被其他方法重写的方法.例如: 2.1关于base调用基类构造函数 public c ...
- 微信小程序制作家庭记账本之五
第五天,开发进度没有进行,不知道该如何下手完成小程序的开发.
- MongoDB3.X单机及shading cluster集群的权限管理(基于3.4.5)
mongodb集群的权限管理分为两部分,一部分是最常用的Role-Based Access Control,也就是用户名密码方式,这种验证方式一般出现在单机系统,或者集群中client端连接Mongo ...