自Win10推出以来,Windows的更新频度变为每年2次(赶上隔壁Ubuntu的更新节奏了)。每次更新,MS都会提出一堆新要求。对于2018年RS4的更新,MS要求所有提交到WU(Windows Update)的驱动程序,除了要提供驱动包本身,还需要额外提供公有调试符号。哎,我只能默默的叹口气,然后照做了...

生成公有调试符号有2种形式:1.编译链接过程中生成;2.从私有调试符号文件中剥离生成。下面我们将分类讨论。

1.编译链接过程中生成

工程属性-Linker-Command Line-Additional Options 增加选项/PDBSTRIPPED:event.pdb 
event.pdb需要替换成你要生成的公有符号名.

2.从私有调试符号中剥离

你可能会问,既然编译器有办法直接生成公有符号,为什么还要考虑这种方式?额,有时候,某个sys文件已经过了HLK测试并获得Logo,如果再次改动,需要重新进行HLK测试。对于这种情况就得用到下面即将提到的工具
虽然,多数文档建议用binplace工具剥离私有调试符号,不过我从来没有成功过。作为替换,我使用windbg目录下pdbcopy.exe命令来生成私有符号。命令格式如下:
pdbcopy privatesymbols.pdb publicsymbols.pdb -p

参数1是由Visual Studio生成的调试符号,这个符号是所谓的私有符号;参数2指定由pdbcopy生成的公有符号名。

例如,下列命令将为C:\Users\jiangminghua\Desktop\event\wdm\objchk_wxp_x86\i386\event.pdb生成公有调试符号:

C:\Program Files (x86)\Windows Kits\10\Debuggers\x86>pdbcopy.exe \
C:\Users\jiangminghua\Desktop\event\wdm\objchk_wxp_x86\i386\event.pdb \
C:\Users\jiangminghua\Desktop\event\wdm\objchk_wxp_x86\i386\event_pub.pdb -p

这样就会生成公有符号,如下图:

3.验证符号

对于用上面方法生成的调试符号,我们不知正确与否,这时就要用到windbg目录下的另一个工具:symchk.exe来验证,其语法为:
symchk.exe /v filename /s sympath

参数1指向二进制文件的全路径,参数2指向包含调试符号的文件夹路径。在验证符号前需要为公有调试符号改名,否则symchk会提示找不到符号文件。比如,上面pdbcopy生成的公有符号名为event_pub.pdb,需要重新改为event.pdb。完成后即可检查调试符号,如我是如此检查前面用pdbcopy生成的符号:

symchk.exe /v \
C:\Users\jiangminghua\Desktop\event\wdm\objchk_wxp_x86\i386\event.sys /s \
C:\Users\jiangminghua\Desktop\event\wdm\objchk_wxp_x86\i386
对于公有调试符号,symchk的输出可能如下:
DBGHELP: C:\Users\jiangminghua\Desktop\event\wdm\objchk_wxp_x86\i386\event.sys - OK
DBGHELP: event - public symbolsC:\Users\jiangminghua\Desktop\event\wdm\objchk_wxp_x86\i386\event.pdb

对于私有调试符号,symchk的输出可能如下:

DBGHELP: C:\Users\jiangminghua\Desktop\event\wdm\objchk_wxp_x86\i386\event.sys - OK
DBGHELP: event - private symbols & linesC:\Users\jiangminghua\Desktop\event\wdm\objchk_wxp_x86\i386\event.pdb

当然,也可以用windbg验证符号是否为公有符号,并且和二进制文件匹配:

kd> .sympath+ C:\Users\jiangminghua\Desktop\event\wdm\objchk_wxp_x86\i386 ;先设置调试符号路径
Symbol search path is: srv*;C:\Users\jiangminghua\Desktop\event\wdm\objchk_wxp_x86\i386
Expanded Symbol search path is: SRV*C:\sym\w7RTMx86*c:\users\jiangminghua\desktop\event\wdm\objchk_wxp_x86\i386************* Symbol Path validation summary **************
Response                         Time (ms)     Location
Deferred                                       srv*
OK                                             C:\Users\jiangminghua\Desktop\event\wdm\objchk_wxp_x86\i386
kd> .reload

加载驱动后,用lm m 和!itoldyouso验证符号:

kd> lm m event
Browse full module list
start    end        module name
918bb000 918bd900   event      (private pdb symbols) ;这是私有符号 c:\users\jiangminghua\desktop\event\wdm\objchk_wxp_x86\i386\event.pdbUnable to enumerate user-mode unloaded modules, Win32 error 0n30
kd> !itoldyouso event ;该符号有二进制文件匹配event.sysTimestamp: 5A20EBF6SizeOfImage: 2900pdb: c:\winddk\7600.16385.1\src\general\event\wdm\objchk_wxp_x86\i386\event.pdbpdb sig: C78FF21D-C5AE-49E3-8E51-18CD585960D7age: 1Loaded pdb is c:\users\jiangminghua\desktop\event\wdm\objchk_wxp_x86\i386\event.pdbevent.pdbpdb sig: C78FF21D-C5AE-49E3-8E51-18CD585960D7age: 1MATCH: event.pdb and event.sys

为了验证公有符号,无重新加载驱动(需要将event_pub.pdb改名为event.pdb),只要如下操作:

kd> .reload /u event ;卸载私有符号
Unloaded event
kd> .reload /f event.sys ;重新加载公有符号
kd> ld event
Symbols already loaded for event
kd> lm m event
Browse full module list
start    end        module name
918bb000 918bd900   event      (pdb symbols) ;此时,括号中没有private这样的词眼    c:\users\jiangminghua\desktop\event\wdm\objchk_wxp_x86\i386\event.pdbUnable to enumerate user-mode unloaded modules, Win32 error 0n30
kd> !itoldyouso eventevent.sysTimestamp: 5A20EBF6SizeOfImage: 2900pdb: c:\winddk\7600.16385.1\src\general\event\wdm\objchk_wxp_x86\i386\event.pdbpdb sig: C78FF21D-C5AE-49E3-8E51-18CD585960D7age: 1Loaded pdb is c:\users\jiangminghua\desktop\event\wdm\objchk_wxp_x86\i386\event.pdbevent.pdbpdb sig: C78FF21D-C5AE-49E3-8E51-18CD585960D7age: 1MATCH: event.pdb and event.sys
参考:
Using PDBCopy
Using SymChk

为可执行程序(sys/exe)生成公有调试符号相关推荐

  1. 我们写的代码是如何一步步变成可执行程序(.EXE)的?

    文章目录 1. 程序的翻译环境和执行环境 2. 编译详解 2.1翻译环境介绍 2.2 编译详解 2.2.1 预处理(预编译) 2.2.2 编译 2.2.3 汇编 2.3 链接详解 2.3.1 合并段表 ...

  2. [Win32]一个调试器的实现(五)调试符号

    一个调试器应该可以跟踪被调试程序执行到了什么地方,显示下一条将要执行的语句,显示各个变量的值,设置断点,进行单步执行等等,这些功能都需要一个基础设施的支持,那就是调试符号. 什么是调试符号 我们知道, ...

  3. vba vbscript.regexp加载dll错误_[原]排错实战——拯救加载调试符号失败的IDA

    本文之前发表的时候有些问题,作为强迫症患者的我又重新编辑后再次发表.如果您已经看过,请忽略.望见谅. 缘起 最近想借助IDA逆向一个函数.在windows下,调试器(比如vs, windbg)可以通过 ...

  4. [原]排错实战——拯救加载调试符号失败的IDA

    本文之前发表的时候有些问题,作为强迫症患者的我又重新编辑后再次发表.如果您已经看过,请忽略.望见谅. 缘起 最近想借助IDA逆向一个函数.在windows下,调试器(比如vs, windbg)可以通过 ...

  5. iOS开发之strip处理framework的调试符号

    对外输出的SDK或者framework包,要使用release版本,这样别人在使用的时候,不会看到自己的输出信息. 生成release包,需要选择Edit Scheme->Run->Inf ...

  6. 解析利用wsdl.exe生成webservice代理类的详解

    利用wsdl.exe生成webservice代理类: 根据提供的wsdl生成webservice代理类 1.开始->程序->Visual Studio 2010 命令提示 2.输入如下红色 ...

  7. 在net.tcp模式下,由SvcUtil.exe生成代理类文件和配置文件(转)

    WCF服务调用可以采用两个方法,由工具SvcUtil.exe生成本地代理服务类和配置文件方式,或者采用ChannelFactory直接创建服务代理对象.本文主要采用前面一种方式来进行. SvcUtil ...

  8. 【错误记录】Ubuntu 下 VSCode 编译报错 ( 无法生成和调试,因为活动文件不是 C 或 C++ 源文件。终端进程启动失败(退出代码: -1)。终端将被任务重用,按任意键关闭。 )

    文章目录 一.报错信息 二.解决方案 一.报错信息 在 VSCode 中 , 创建 cpp 源码 : #include <iostream> #include <vector> ...

  9. 计算机中丟失Slc.dll,调试符号不会加载slc.dll和sppc.dll

    这是我的情况.我正在尝试在远程服务器上调试WCF服务(Windows 2012 R2 Standard).我在运行Visual Studio 12的Windows 7专业系统上.在弄清楚如何安装远程调 ...

最新文章

  1. 微生物组-扩增子16S分析研讨会(2020.1)
  2. 怎么修改与服务器的操作系统,怎么修改与服务器的操作系统
  3. SQL Server配置delegation实现double-hop
  4. HAS_NO_PRIVILEGE解决方案
  5. 悬浮窗_华为手机悬浮窗设置在哪里
  6. iOS 关于UITableView的黑科技
  7. 【Scala】Scala中的_ 和 _*分别代表什么
  8. 安装caffe时出现“MySQL”不是内外不wenjian
  9. CentOS7安装Nginx,全网最快安装教程
  10. [C++] map 使用场合
  11. Dapper Sqlpara where in
  12. arduino外接SSD1306不显示
  13. SQL Server Always Encrypted加密使用
  14. Android-第十三节04Room框架详解
  15. html整体图片拆分拼图代码源代码,canvas拼图功能实现代码示例
  16. fiyme android底层,魅族首批Android 10底层Flyme于今日正式推送
  17. 台式机CPU型号后缀含义
  18. 全新PHP云盘网盘系统Cloudreve程序源码一键安装版+可对接多家云存储网盘
  19. python网络爬虫汽车之家汽车高清图片
  20. Assignment HDU - 2853(二分图匹配 KM)

热门文章

  1. 详解ARM Cortex-M33处理器:性能/功耗/安全的最佳平衡
  2. 双11剁手之家里有矿系列 90后居然是这么旅行的……
  3. 前端页面布局CSS实操Demo1
  4. python--利用有道网址编写一个翻译句子的程序
  5. 搜索引擎的优化(seo)
  6. 37 --> 详解 OpenWRT系统框架基础软件模块之 procd
  7. 关于蓝桥杯的考生须知和要求
  8. 使用宽屏显示器 的设置[zt]
  9. 迁移学习——Joint Geometrical and Statistical Alignment for Visual Domain Adaptation
  10. 学习使用php获取企业微信通讯录管理接口代码