windbg是如何搜索符号文件的?

摘要:
当windg加载符号文件时,表示此目录中有自动下载的符号文件。然后windag会在自动下载时根据存储路径检查符号文件是否存在。Debug_SymbolSymbols32ttkrnlpa.pdb按pdb索引搜索(需要pingme.txt)。对于由windg自动下载的符号文件,请检查是否有由windg从符号服务器下载的压缩符号文件。

来个样例

我的符号目录设置是:
windbg是如何搜索符号文件的?第1张

用我们在windows下调试必须用到的ntdll.dll模块来讲下windbg加载符号文件的过程。windbg加载符号文件时,会首先根据配置的符号目录信息,在本地符号目录中查找对应的符号文件。一个典型的搜索过程如下:
F:Debug_SymbolSymbols32
F:Debug_SymbolSymbols32pingme.txt
F:Debug_SymbolSymbols32flat.txt
F:Debug_SymbolSymbols32index2.txt
F:Debug_SymbolSymbols32 tdll.pdb2505F15902821D2C6931BBFF1B941EBF1 tdll.pdb
F:Debug_SymbolSymbols32 tdll.pdb2505F15902821D2C6931BBFF1B941EBF1 tdll.pd_
F:Debug_SymbolSymbols32 tdll.pdb2505F15902821D2C6931BBFF1B941EBF1file.ptr

首先解释一下路径中的那一串字母和数字混合的东西是什么玩意儿,这个字符串是编译器根据编译时的时间、版本、程序类型等信息生成的一个类似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 目录下的子目录过多。比如以下路径:
    F:Debug_SymbolSymbols32kekernel32.pdb
    F:Debug_SymbolSymbols32 t tdll.pdb
    F:Debug_SymbolSymbols32 t tkrnlpa.pdb
  3. 按pdb索引搜索(要求pingme.txt存在)
    对于windbg自动下载的符号文件,会以"符号目录+符号文件名+pdb索引串+符号文件名的方式"为路径存储符号文件,这样,在下次需要查找该符号时,可以直接从PE文件中取得pdb索引串,然后构造出这样一个路径来快速加载符号文件。这就是搜索路径"F:Debug_SymbolSymbols32 tdll.pdb2505F15902821D2C6931BBFF1B941EBF1 tdll.pdb"的由来。当存在pingme.txt时,将优先采用这种方式搜索。当然,自动下载符号的目录一般会自动创建一个pingme.txt的。
  4. 检查是否存在压缩的符号文件
    windbg从符号服务器下载的符号文件,有些可能是压缩形式(文件名以_结束,需要用expand.exe解压缩),所以windbg会检查ntdll.pd_的存在,若存在就会将其解压缩。file.ptr可能也是某种方式的临时文件,暂时我无法完全解释它。
  5. 以符号文件名作为文件夹名进行搜索
    如果以上都没有找到,那么就检查符号目录下ntdll.pdb这个文件夹是否存在,注意这里是文件夹。如果该文件夹存在,就会继续查找F:Debug_SymbolSymbols32 tdll.pdb tdll.pdb。若文件夹不存在,就会直接在符号目录下查找符号文件ntdll.pdb(注意是文件)。
  6. 以目标文件的类型作为分类搜索
    如果仍然没有找到,那么将根据PE文件的类型(dll,exe,sys,ocx等)作为子目录进行查找(安装的符号文件一般是以这种路径形式存放的)。
  7. 以目标文件Debug信息中指定的符号路径进行搜索
    对于我们自己编译的驱动,通常是包含了pdb文件的全路径的,随便用一个编辑器打开一个sys文件都可以看到文件中出现的pdb路径信息。
  8. 搜索windbg所在路径
  9. 到符号服务器查找符号
    如果以上都没有找到的话,也就是说本地符号库中无法找到匹配的符号文件,如果符号设置中允许自动到符号服务器下载符号(比如出现了"SRV*F:Debug_SymbolSymbols32*http://msdl.microsoft.com/download/symbols"这样的配置),那么windbg就会根据PE文件的pdb索引串到符号服务器上查找是否有与该pdb索引串匹配的符号文件,若有,就将其下载到本地,若没有,那就是真的没有了,windbg将返回"ERROR: Symbol file could not be found."

免责声明:文章转载自《windbg是如何搜索符号文件的?》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Maven详解(三)------ Maven工程目录介绍概率论12 矩与矩生成函数下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

NLog类库使用探索——详解配置

https://www.cnblogs.com/fuchongjundream/p/3936431.html 1 配置文件的位置(Configuration file locations)     通过在启动的时候对一些常用目录的扫描,NLog会尝试使用找到的配置信息进行自动的自我配置。 1.1 单独的*.exe客户端     单独的客户端,NLog将在以...

Linux上MySql远程备份方案

思路:每天定时将Linux上的MySql备份在本地,然通过FTP上传到FTP服务器上。 1、 使用mysqldump工具将MySql数据库备份 mysqldump --default-character-set=utf8 --complete-insert -u root -pyourpassword -c jbpm > /u01/jbpm.sql ...

apk反编译与破解

前段时间项目上线,单机游戏,想着肯定是会被破解的,但没想到,分分钟就被破了,游戏数据也是相当的差,于是闲暇时,也自己研究下安卓的破解。个人观点(装一下X):所谓反编译和破解付费等都只应用于学习交流,发布出去,就有点太不尊重他人劳动成果了。 使用工具:(当然首先得配好java环境,这是废话)   apktool : 资源文件获取,可以提取出图片文件和布局文件...

ligerUI框架

一、介绍 ligerUI是一个轻量级的前端开发框架。简单的说,就是能够帮助开发快速搭建网页,并且不需要更多的写前端代码,能够在最短的时间内开发出一套美观,优雅的前端界面。 需要掌握的技术有html,css,js,jquery,json,还有一些后端代码能力,不然就不能开发出自己想要的功能咯。 首先进入官网下载一个ligerUI的demo,下载好之后的效果...

静态分析基础技术

目录 这是《恶意代码分析实战》一书第1章的笔记 注意,文中的链接都有可能是恶意的,请勿随意点击 1.反病毒引擎扫描1-1.Virus Total 2.哈希值 2-1.md5deep 2-2.WinMD5 3.查找字符串3-1.Strings程序 4.加壳与混淆恶意代码 4-1.文件加壳 4-2.使用PEiD检测加壳 4-3.使用UPX...

Ubuntu Linux 查看、编辑、比较二进制文件

查看二进制有以下几种方法: 方法一:hexdump apt-get install libdata-hexdumper-perl 安装好之后就可以直接hexdump your_binary_file 也可以直接使用hd命令来代替hexdump 如果想要慢慢看 : hd your_binary_file | more 方法二: Vim 可以用来查看和编辑二...