顺序执行命令需要哪个符号链接_搭建自己的符号服务器

原标题:搭建自己的符号服务器

4c3fd640ceb1500c3c30fca55cd59253.png

本文为看雪论优秀文章

看雪论坛作者ID:comor

  • 目录
  • 0x00. 常规分析示例
  • 1. 当没有pdb时
  • 2. 当只有pdb时
  • 3. 当既有pdb又有源码时
  • 0x01. 原理
  • 1. dump和pdb
  • 2. pdb与源码
  • 3. pdb和exe
  • 4. 进一步
  • 5. 应用场合

注意:如果你要找的是微软符号服务器,不用往下看了……

当发生应用异常崩溃、驱动蓝屏时,无论是测试环境,还是生产环境,分析dump文件通常是快速定位问题的一个最佳选择(前提是生成了dump文件)。特别是在生产环境时,既没有源码又没有调试器,这时只有将日志文件、dump文件拷贝回慢慢分析了。

一般常规分析步骤:使用Windbg打开dump文件, 设置符号路径、源码路径,输入!analyze -v,完事!

注:必须使用与产生dump文件的exe相对应的pdb文件(同时生成)才能进行分析!

但是,重点的两个要素往往不能快速准备完成:源码文件和符号文件。特别是,当交付的应用或者驱动已经过去了好几个版本迭代,怎么办?常规做法:从svn或者git中checkout当初的源码和符号文件版本,继续常规分析(你最好保存了符号文件)。

当崩溃次数不是很经常时,常规做法并不是很麻烦。但是,当你维护的应用或者驱动很多,手边活儿又很多时,这样一边查看版本,一边扒拉源码,既耗时,又劳心。特别当你忘了备份pdb文件时,挠头去吧……

0x00. 常规分析示例

代码见附件。

1. 当没有pdb时

打开dump文件,直接!analyze -v:

cba3ce3dfb8fb2f4b535d021e4cf5f09.png

并不知道是出错在哪里。

2. 当只有pdb时

配置pdb路径后,再次!analyze -v:

fea72f59933b8ac36abf64b627c93595.png

已经知道了错误的文件及行号!

这里需要注意,如果是在原开发机器上分析,如果之前的源码还在原路径,即使没有配置源码路径,也会和有源码的情况一样。此时,如果源码版本不对应,可能会显示错误的代码行。

3. 当既有pdb又有源码时

配置源码路径后,再次!analyze -v:

5a03de401067054e72fdb075b08626e0.png

直接定位到了错误文件的哪一行(一般是箭头的上一行),memcpy向空指针拷贝数据,所以崩了。

0x01. 原理

1. dump和pdb

为什么有了pdb和源码便可以分析dump呢?不用说,dump文件中肯定有一些与pdb文件的信息,而pdb文件中存储了一些信息用于分析dump的数据,从上面分析过程可以看出,除了一些用于分析的数据外,肯定还包括 源码路径、行数等信息。

首先看dump文件信息,使用文本工具打开,搜索.pdb,可以找到:

42158b7bbc81feaa7a400fda2d62290d.png

即:dump文件中存储了pdb的信息(不止一个pdb),所以打开dump文件的时候会知道寻找哪个/些pdb。

2. pdb与源码

对于pdb文件格式,微软并没有公开,但是可以通过COM接口来访问pdb文件中存储的信息,示例工程代码参见文末链接。根据链接工程编译出的exe(即网上的pdb inspector,下载见附件),可以查看pdb信息,如下图:

附件的pdb inspector不能连续打开pdb文件,如果要打开新的文件,需要退出软件,再打开;如果根据源码重新编译,虽然可以打开新的文件,但显示的仍是第一个打开文件的信息。

c84697e74190430b8c6d22dffa50826e.png

即:pdb文件中确实存储了源码信息。此外,pdb文件中有一串GUID,如果使用hex查看dump文件的话,会发现——pdb路径字符串前面的数据便是这一串GUID,可以说,dump匹配pdb文件并不是仅仅靠路径,而是靠这一串pdb精确匹配(还有age,后续提到)。

4b721adc06d31748631b18c399785bed.png

对于pdb文件格式,不需要深究,我们只需要知道pdb文件很重要,在备份源码的时候,尽量将发布版本的pdb文件一起备份,且保存好(不要外泄)。“在某些情况下,pdb就是你的源码”。

3. pdb和exe

这里说一种情况,当你拷贝回了dump文件,也备份了pdb,但是忘了pdb和发

布版本的对应关系了(没有放一起,例如,为了防止万一不小心发布应用的时候,把pdb也一并打包出去了,而将源码和pdb分开保存)。

怎么办?——pdb和exe也有对应关系,找到了对应的exe,对应的源码版本也就知道了(如果把发布的版本和对应的源码对应也搞混了……猜吧)。

在exe中也有一个GUID,使用dumpbin工具可以查看,这个GUID便是和pdb文件的GUID对应的,如果不对应,说明两者并不是同时生成的:

...MSVC14.16.27023binHostx86x86>.dumpbin.exe/headers D:桌面ReleaseDumpDemo.exe Microsoft(R) COFF/PE Dumper Version 14.16.27040.0 Copyright(C) Microsoft Corporation. All rights reserved. …… DebugDirectories TimeType Size RVA Pointer --------------- -------- -------- -------- 5F55D0B2cv 3E 00002218 1218 Format: RSDS, {A3CC46D4-F10E-4703-A393-DA7288A713C1}, 3, D:WorkDumpDemoReleaseDumpDemo.pdb 5F55D0B2feat 14 00002258 1258 Counts: Pre-VC++ 11.00=0, C/C++=23, /GS=23, /sdl=2, guardN=0 ……

相信你已经找到GUID了,我不知道怎么加粗或标红……此外,大牛blackint3的ARK工具Openark也很方便地提供了查看(里面还有很多实用工具,推荐!),一并上图:

6e3efb197f99ff9de8c0eb077b0bc4f6.png

可以看出,该工具可以方便查看GUID,和dumpbin一致(当然一致啦!)。另外,还将符号ID组合了起来(GUID+后面的数字age),如果你曾经下载过微软官网符号,本地符号子文件夹的名称就是这个符号ID,一并上图:

f23ece1cd875c08d21f7da1ae6cc3dd7.png

而pdb文件中的GUID可以使用PDB inspector查看,如图中所示,它们的对应关系即:GUID+age。

590e1114d8995325b0e330c6168fdaee.png

4. 进一步

有了dump和pdb、pdb和源码的关系,windbg才能根据dump文件搜索到对应的pdb文件,而由pdb文件中的源码信息,windbg会自动到对应路径去下载源码。

  • 如果将pdb文件中的源码信息定制为我们的版本控制系统——源文件索引
  • 再将pdb文件存入集中的一个位置——符号服务器。那么,分析dump就 会变的更便利,只需要在Windbg中配置好符号服务器路径,保证源码服务器可以正常连接,便可以分析dump了(windbg自动会寻找下载符号文件和源码)。

5. 应用场合

发布版本众多,每次dump对应的pdb,pdb对应的源码均要手动查找对应;

随时随地方便地分析dump。

参考网址

pdb文件解析:

看雪ID:comor

责任编辑:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值