【旧文章搬运】关于windbg搜索符号文件的一点说明
原文发表于百度空间,2010-09-07
==========================================================================
本来只是打算以回复的形式回答一下m_sunv同学关于windbg搜索符号的问题,不料写得太多,超过了评论字数,索性就更详细一点单独写一篇文章来说明一下windbg查找符号文件的问题吧~
以下所有说明以本人的符号目录设置为前提,我的符号目录设置是:
_NT_SYMBOL_PATH=D:\MyLocalSymbols;D:\MySysSymbols
windbg加载符号文件的过程如下(以加载testGetObj.sys的符号为例,命令是"ld testGetObj"):
windbg加载符号文件时,会首先根据配置的符号目录信息,在本地符号目录中查找对应的符号文件。比如以上命令,在本地搜索时,一个典型的搜索过程如下:
D:\MyLocalSymbols\
D:\MyLocalSymbols\pingme.txt
D:\MyLocalSymbols\flat.txt
D:\MyLocalSymbols\index2.txt
D:\MyLocalSymbols\testGetObj.pdb\7CEF954F6E0647149F7447797763E3E31\testGetObj.pdb
D:\MyLocalSymbols\testGetObj.pdb\7CEF954F6E0647149F7447797763E3E31\testGetObj.pd_
D:\MyLocalSymbols\testGetObj.pdb\7CEF954F6E0647149F7447797763E3E31\file.ptr
D:\MySysSymbols\pingme.txt
D:\MySysSymbols\testGetObj.pdb\
D:\MySysSymbols\testGetObj.pdb\testGetObj.pdb//当上面一个路径存在时
D:\MySysSymbols\testGetObj.pdb
D:\MySysSymbols\sys\testGetObj.pdb
D:\MySysSymbols\symbols\sys\testGetObj.pdb
F:\mySys\testGetObj\objchk\i386\testGetObj.pdb
C:\Program Files\Debugging Tools for Windows\testGetObj.pdb
首先解释一下路径中的那一串字母和数字混合的东西是什么玩意儿,这个字符串是编译器根据编译时的时间、版本、程序类型等信息生成的一个类似GUID一样的东西(VC6编译的符号文件其内部编号是编译时间的绝对秒,就是 time 函数返回的32位从1970年1月1日0点开始的秒数,后面加上程序的特征,例如目标机器的类型、程序类型等;VC7.0、7.1、8.0、9.0 编译的符号文件编号是一个 GUID,这可能是为了避免多线程同时编译相同特征的程序引发内部编号冲突),存储在PE文件的DebugDirecotry数据目录指向的数据中,暂且称之为pdb的索引串,对于每个编译出来的文件而言它是唯一的。同名文件的不同版本,它的这个索引串也不同。
下面我来逐一解释下上面看到的这个搜索过程:
1、先检查符号目录是否存在
这个很好解释,符号目录都不存在的话,搜索自然无从谈起
2、检查符号目录下是否存在flat.txt、pingme.txt或index2.txt
这三个文件的存在与否,决定了搜索过程中的一些细节。
如果存在pingme.txt,说明该目录下存在自动下载的符号文件。那么windbg将按照自动下载时的存放路径来检查符号文件是否存在。若没有pingme.txt,将不会采用这种路径来搜索。具体搜索方式参考第3条。
如果存在flat.txt(即使同时也存在pingme.txt),将忽略上面这种采用pdb索引串的快捷搜索方式,只以文件名和文件类型等信息进行搜索。
如果存在index2.txt,将按照文件名称分组进行搜索。分组方式是:使用符号文件名称的前两个字母最为一级目录,符号文件的名称作为二级目录,符号文件的编号作为三级目录,如此可对大量的文件进行分级索引,避免Symbols 目录下的子目录过多。比如以下路径:
D:\MyLocalSymbols\ke\kernel32.pdb\
D:\MyLocalSymbols\nt\ntdll.pdb\
D:\MyLocalSymbols\nt\ntkrnlpa.pdb\
3、按pdb索引搜索(要求pingme.txt存在)
对于windbg自动下载的符号文件,会以"符号目录+符号文件名+pdb索引串+符号文件名的方式"为路径存储符号文件,这样,在下次需要查找该符号时,可以直接从PE文件中取得pdb索引串,然后构造出这样一个路径来快速加载符号文件。这就是搜索路径"D:\MyLocalSymbols\testGetObj.pdb\7CEF954F6E0647149F7447797763E3E31\testGetObj.pdb"的由来。当存在pingme.txt时,将优先采用这种方式搜索。当然,自动下载符号的目录一般会自动创建一个pingme.txt的。
4、检查是否存在压缩的符号文件
windbg从符号服务器下载的符号文件,有些可能是压缩形式(文件名以_结束,需要用expand.exe解压缩),所以windbg会检查testGetObj.pd_的存在,若存在就会将其解压缩。file.ptr可能也是某种方式的临时文件,暂时我无法完全解释它。
5、以符号文件名作为文件夹名进行搜索
如果以上都没有找到,那么就检查符号目录下testGetObj.pdb这个文件夹是否存在,注意这里是文件夹。如果该文件夹存在,就会继续查找D:\MySysSymbols\testGetObj.pdb\testGetObj.pdb。若文件夹不存在,就会直接在符号目录下查找符号文件testGetObj.pdb(注意是文件)。
6、以目标文件的类型作为分类搜索
如果仍然没有找到,那么将根据PE文件的类型(dll,exe,sys,ocx等)作为子目录进行查找(安装的符号文件一般是以这种路径形式存放的)。
7、以目标文件Debug信息中指定的符号路径进行搜索
对于我们自己编译的驱动,通常是包含了pdb文件的全路径的,随便用一个编辑器打开一个sys文件都可以看到文件中出现的pdb路径信息。
8、搜索windbg所在路径
这个没什么说的,在windbg所在路径下进行搜索。
9、到符号服务器查找符号
如果以上都没有找到的话,也就是说本地符号库中无法找到匹配的符号文件,如果符号设置中允许自动到符号服务器下载符号(比如出现了"SRV*D:\MyLocalSymbols*http://msdl.microsoft.com/download/symbols"这样的配置),那么windbg就会根据PE文件的pdb索引串到符号服务器上查找是否有与该pdb索引串匹配的符号文件,若有,就将其下载到本地,若没有,那就是真的没有了,windbg将返回"ERROR: Symbol file could not be found."
了解了以上过程,现在回答提出的问题就简单了。
Q:不同系统的同名符号文件放在同一个符号目录里,会对windbg查找符号文件有影响吗?
A:有没有影响,取决于符号文件“放置”的方式,即这个符号文件是如何到符号目录中的。
如果是从微软官网下载的符号安装包,以ntfs.sys为例,安装到目录D:\MyLocalSymbols,那么其完整路径将是:
D:\MyLocalSymbols\sys\ntfs.pdb
显然,如果将不同系统的符号包安装在同一个文件夹,那么因为路径重复问题,同名的符号文件很有可能被覆盖,那么就只能存储一个有效的符号文件,而不能并存,想要并存的话就得安装到不同的文件夹,并将这些文件夹都添加到_NT_SYMBOL_PATH环境变量中。
如果你安装的符号文件不在同一个目录里,那也许还可以并存。
如果是windbg自动从符号服务器下载的服务,那么不同系统的同名文件之间是没有影响的。举个例子,WinXP有ntfs.sys,Win7也有ntfs.sys,这两个ntfs.sys显然是不一样的,那么这两个同名文件的同名符号文件在符号目录中是怎么放的呢?
在我的系统上,两个ntfs.pdb的实际位置如下:
D:\MyLocalSymbols\ntfs.pdb\CF3F539EE3B2408887756DD42D7E53442\ntfs.pdb
D:\MyLocalSymbols\ntfs.pdb\DEF98FCD9F6340F6B23B65421A08CFD72\ntfs.pdb
可以看到,这两个ntfs.pdb都位于D:\MyLocalSymbols\ntfs.pdb目录下,但是按照pdb索引放在了不同的子文件夹里,当Windbg搜索时,自会按照pdb索引进行优先搜索,并不会有冲突问题。
Q:我把符号文件放在符号目录里一个叫abc的子文件夹下,为什么windbg就找不到了?
A:结合上面说明的windbg搜索符号文件的过程就知道了,windbg不可能无缘无故地去到符号目录下一个叫abc的文件夹里进行搜索,能进行那么多处搜索已经是考虑得很全面了,难道你指望windbg知道符号目录下一个叫abc(或者其它一个没有任何规律和来由的名字)的目录里存储着你要找的符号文件?显然是不可能的!出于搜索效率考虑,windbg不可能去枚举符号目录中的每一个符号文件来进行检查匹配,所以找不到就不足为怪了。如果你是程序员,让你来解决搜索符号这个问题,在兼顾效率的同时还要尽可能全面,我想你也不会想着到某一个不知来历的子目录下去搜索我们要找的文件吧?所以,符号文件该怎么放就怎么放,我们就不要去难为windbg了嘛~~
【旧文章搬运】关于windbg搜索符号文件的一点说明的更多相关文章
- 【旧文章搬运】Windbg+Vmware驱动调试入门(四)---VirtualKD内核调试加速工具
原文发表于百度空间,2009-01-09========================================================================== 今天又想起 ...
- 【旧文章搬运】Windbg+Vmware驱动调试入门(三)---Windbg基本调试入门
原文发表于百度空间,2009-01-09========================================================================== 这一节的内 ...
- 【旧文章搬运】Windbg+Vmware驱动调试入门(二)---Vmware及GuestOS的设置
原文发表于百度空间,2009-01-08========================================================================== 这一篇是主 ...
- 【旧文章搬运】Windbg+Vmware驱动调试入门(一)---Windbg的设置
原文发表于百度空间,2009-01-08========================================================================== Windb ...
- 【旧文章搬运】深入分析Win7的对象引用跟踪机制
原文发表于百度空间及看雪论坛,2010-09-12 看雪论坛地址:https://bbs.pediy.com/thread-120296.htm============================ ...
- 【旧文章搬运】更正一个枚举PspCidTable时的错误
原文发表于百度空间及看雪论坛,2009-02-27 看雪论坛地址:https://bbs.pediy.com/thread-82919.htm============================= ...
- 【旧文章搬运】PE感染逆向之修复(Serverx.exe专杀工具出炉手记)
原文发表于百度空间,2008-10-4看雪论坛发表地址:https://bbs.pediy.com/thread-73948.htm================================== ...
- 【旧文章搬运】加载PE文件时IAT的填充时机
原文发表于百度空间,2011-06-20========================================================================== 大致过程如 ...
- 【旧文章搬运】Win7 OBJECT_HEADER之TypeIndex解析
原文发表于百度空间,2010-08-09========================================================================== 在Wind ...
随机推荐
- PHP如何学习?
PHP 的学习,可以归纳为三个类型: 语言的基础语法学习,这些是 ifelse, while, switch, class, function, trait 等: 内置函数/类学习,这 ...
- Hnu 11187 Emoticons :-) (ac自己主动机+贪心)
题目大意: 破坏文本串.使之没有没有出现表情.破坏就是用空格替换.问最少须要破坏多少个字符. 思路分析: 初看跟Hdu 2457 没什么差别,事实上Hdu2457是要求将字符替换成ACGT,而这个仅仅 ...
- 手把手教你nginx/linux下如何增加网站
先进入到nginx的配置文件目录请输入以下命令 cd /alidata/server/nginx/conf/vhosts 再输入 ll 看看是不是像下面截图的一样 用神器xftp将default. ...
- win7-64bit下基于VMware12.5安装rhel-server-6.3-i386
/************************************************************************************* 宿主PC:win7-64b ...
- node JS 微信开发
JS-SDK 要点 微信测试号; 扫码登录;无需认证(只是名称统一为微信测试号)http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/logi ...
- Windows下利用CMake和VS2013编译OpenCV
转载自:http://www.chengxulvtu.com/2014/03/19/windows_build-opencv-with-cmake-and-vs2013.html 获取OpenCV ...
- iOS UILabel文字缩进
使用NSMutableParagraphStyle实现label文字首尾的缩进 NSMutableParagraphStyle *paraStyle = [[NSMutableParagraphSty ...
- linux下如何安装软件(转载)
来源:http://zhidao.baidu.com/link?url=5oR8WxygPvVMhSZvXQahYKm01JPTmQnEUjbQF562Yxgd3r6bYpki1ZPcHAsij6E4 ...
- EasyDarwin接入ffmpeg实现264转图片快照功能
本文转自:http://blog.csdn.net/cai6811376/article/details/51774467 EasyDarwin一直坚持开源精神,所以我们着手把EasyDarwin中使 ...
- EasyDarwin流媒体服务器实现关键帧推送功能
-本篇由团队成员Fantasy供稿! 功能背景 随着社会进步,人们对产品体验要求越来越高.EasyDarwin也不例外.为了能满足用户对链接服 后看到画面时间(也就是我们经常看到的起播时间)短的要求, ...