符号文件(.pdb)——Windows 应用程序调试必备
最近在做项目需求过程中,时不时会遇到崩溃,总是异常中断,于是学习了windbg进行调试的一些基础,windbg在接下来文章进行更新,先介绍在windbg调试中一个重要文件(符号文件)
一、符号文件定义
符号文件(Symbol Files)是一个数据信息文件,它包含了应用程序二进制文件(比如:EXE、DLL等)调试信息,专门用来作调试之用,最终生成的可执行文件在运行时并不需要这个符号文件,但你的程序中所有的变量信息都记录在这个文件中。所以调试应用程序时,这个文件是非常重要的。用 Visual C++ 和 WinDbg 调试程序时都要用到这个文件。
在 Windows 系统中,符号文件以 .pdb 为扩展名,比如:每个 Windows 操作系统下有一个 GDI32.dll 文件,编译器在编译该 DLL 的时候会产生一个 GDI32.pdb 文件,一旦你拥有了这个 PDB 文件,那么便可以用它来调试并跟踪到 GDI32.dll 内部。该文件和二进制文件的编译版本密切相关,比如修改了 DLL 的输出函数,再编译该 DLL,那么原先的 PDB 文件就过时了,不能再用老的 PDB 文件来做调试工作,而必须使用最新的 PDB 文件版本。
Visual C++ 编译代码后会在 Debug 或者 Release 目录下生成一个 PDB 文件。一般情况下,符号文件包括以下的数据信息:
全局变量(Global variables);
局部变量(Local variables);
函数名和它们的入口地址(Function names and the addresses of their entry points);
FPO 数据(Frame Pointer Omission):Frame Pointer 是一种用来在调用堆栈(Call stack)中找到下一个将要被调用的函数的数据结构源代码的行序号(Source-line numbers);
二、符号文件的获取
先确定你的操作系统(OS)版本;
到微软网站下载相应的符号文件;
安装符号文件,对于符号文件的安装位置没有特贝要求,可以安装在任何目录中;
设置环境变量,使得调试工具(比如:Visual C++、WinDbg、Ntsd、DrWatson 等)能找到符号文件;
安装符号文件的注意事项:
如果是手动安装符号文件,有一点很重要,那就是宿主机(Hostt Computer)上的符号文件必须与目标机器(Target Computer)上的 Windows 版本相匹配。
这里所谓的宿主机指的是运行调试会话的机器,在典型的双系统调试会话环境中,宿主机可以是连接到目标机器的任何机器。目标机器指的是发生软件组件、系统服务、应用程序或操作系统运行失败的机器。也即是需要被调试的机器,它是调试会话关注的焦点。目标机器可以近在咫尺,也可以位于完全不同的地方。有时我们也将目标机器称之为――被调试者(debuggee),那么与之对应,宿主机则可以称为调试者(debugger)。
三、在 Visual C++或VS 产生 Release或debug 版本二进制文件对应的 PDB 文件
在 Visual C++ 6.0和VS对象的设置位置会差别很大,不过大体思路一直,编译器有的在release或debug下不生成对应的PDB文件,需要我们去设置,可以通过点击项目属性里面有个链接器(link)下有调试,其中会有相关设置是否生成PDB文件。
四、系统符号文件的更新方法
系统符号文件指 Windows 操作系统依赖的那几个重要的 DLL/SYS 和可执行文件对应的符号文件,常见的比如:gdi32.dll、Kernel32.dll、Kerberos.dll、psapi.dll、user32.dll等,使用 WinDbg 调试时,你就会发现系统符号文件(PDB)有多重要,这些文件都与本地的 OS 密切相关,比如,Windows 2000 打了SP补丁的话,那么必须更新系统符号文件才能进行相关调试,原来的符号文件与打补丁后的系统就会不匹配,怎么办呢? 可以通过网络来更新!象下面这样在 WinDbg 的 Symbols Path 里面输入路径:
1. SRV*D:\Symbols\websymbols*2. http://msdl.microsoft.com/download/symbols(斜体部分是你在本地保存符号文件的路径)
如果你不是通过代理上网,那么在你用 WinDbg 打开一个被调试程序后,输入 symchk 回车,WinDbg 就会自动的连到微软的网站根据你的机器的情况更新的 PDB 文件,并将它保存在上面斜体部分指定的本地路径里,这样你就可以确保你的符号文件版本和你机器上的文件版本一致。
如果你是通过代理上网那么你需要配置 IE 的连接设置。具体方法恕不赘言。
符号文件(.pdb)——Windows 应用程序调试必备的更多相关文章
- 【系统篇】从int 3探索Windows应用程序调试原理
探索调试器下断点的原理 在Windows上做开发的程序猿们都知道,x86架构处理器有一条特殊的指令——int 3,也就是机器码0xCC,用于调试所用,当程序执行到int 3的时候会中断到调试器,如果程 ...
- 从int 3探索Windows应用程序调试原理
http://www.cnblogs.com/xuanyuan/p/3998408.html
- Windows程序调试系列: 使用VC++生成调试信息 转
Windows程序调试系列: 使用VC++生成调试信息 ZhangTao,zhangtao.it@gmail.com, 译自 “Generating debug information with Vi ...
- vs调试windows mobile程序时布署时间太长的解决办法
vs调试windows mobile程序时布署时间太长的解决办法 1.VS平台上,选工具-选项-项目和解决方案-MS BUILD项目生成输出详细信息中选择“诊断”,目的是在调试窗口中看出哪个过程编译的 ...
- Windbg程序调试系列1-常用命令说明&示例
Windbg程序调试是.Net高级开发需要掌握的必备技能,分析内存泄露.分析高CPU.分析线程阻塞.分析内存对象.分析线程堆栈.Live Dedugging.这个领域可以说一个技能+场景化应用的结合, ...
- .NET应用程序调试—原理、工具、方法
阅读目录: 1.背景介绍 2.基本原理(Windows调试工具箱..NET调试扩展SOS.DLL.SOSEX.DLL) 2.1.Windows调试工具箱 2.2..NET调试扩展包,SOS.DLL.S ...
- App_global.asax.pdb: 另一个程序正在使用此文件,进程无法访问。
页面修改后,浏览报错,信息如下. 编译错误 说明: 在编译向该请求提供服务所需资源的过程中出现错误.请检查下列特定错误详细信息并适当地修改源代码. 编译器错误消息: CS0042: 创建调试信息文件“ ...
- Windows桌面开发者的必备软件
如果你新安装好了一台WindowsXP或者Windows7的机器,作为一个开发人员,我建议安装下面这些软件: 1,WinMerge. http://winmerge.org/ 2, Lua for w ...
- WinCE程序调试方法【转】
刚刚接触WinCE编程,感觉大部分跟WinForm一样.刚开始的时候,不知道怎么进行断点调试,后来同事告诉我,可以直接连接进行断点调试,一试之下,果然好用,所以拿出来分享一下. 必备工具: Micro ...
随机推荐
- 快速提取PROTEL99SE PCB文件上的封装方法
1.首先打开你要提取元件封装的PCB. 2.执行生成元件库的命令...软件会帮你把这个PCB上的所有元件生成一个临时库. 3.打开你自己的元件库... 4.PCB刚才生成的元件库中选中你所需要的元件, ...
- [WPF疑难] 继承自定义窗口
原文 [WPF疑难] 继承自定义窗口 [WPF疑难] 继承自定义窗口 周银辉 项目中有不少的弹出窗口,按照美工的设计其外边框(包括最大化,最小化,关闭等按钮)自然不同于Window自身的,但每个弹出框 ...
- 羊和汽车问题(或s三门问题(Monty Hall problem)亦称为蒙提霍尔问题)
三门问题(Monty Hall problem)亦称为蒙提霍尔问题.蒙特霍问题或蒙提霍尔悖论,大致出自美国的电视游戏节目Let's Make a Deal.问题名字来自该节目的主持人蒙提·霍尔(Mon ...
- BNU Invading system
http://www.bnuoj.com/bnuoj/problem_show.php?pid=29364 这个题被坑了. 题意:密码就是那些数字里面的数,转换成二进制后1最少的那个数,当1的个数相同 ...
- Java数据类型BooleanDemo
- 自己动手为PHP7添加新的语法特性
好文章! nikic介绍了如何向PHP添加新的语法特性,原文写的非常精彩,具体是添加in语法功能,使最终实现: <?php $words = ['hello', 'world', 'foo', ...
- SQL Server 自学笔记
--★★★SQL语句本身区分大小写吗 --SQLServer 不区分大小写 --Oracle 默认是区分大小写的 --datetime的输入格式,2008-01-07输入进去后显示为1905-06-2 ...
- iOS 开发设计常用软件及工具整理
1, xCode 2, AppCode 3, Skech 原型设计软件 4, Hype 动画设计工具 5, fontawsome 免费图表 6, Prepo icon, images.catlog 生 ...
- (Problem 7)10001st prime
By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6th prime is 13. ...
- django perm用法
定义用户model时可以给用户分配权限: class Meta: permissions = ( ("can_mark", "Can mark"), ...