为可执行程序(sys/exe)生成公有调试符号
来源:互联网 发布:重庆知秋凤凰婚礼 编辑:程序博客网 时间:2024/04/28 23:35
自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 - OKDBGHELP: event - public symbols C:\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 - OKDBGHELP: event - private symbols & lines C:\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\i386Expanded 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) LocationDeferred srv*OK C:\Users\jiangminghua\Desktop\event\wdm\objchk_wxp_x86\i386kd> .reload加载驱动后,用lm m 和!itoldyouso验证符号:
kd> lm m eventBrowse full module liststart end module name918bb000 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 0n30kd> !itoldyouso event ;该符号有二进制文件匹配event.sys Timestamp: 5A20EBF6 SizeOfImage: 2900 pdb: c:\winddk\7600.16385.1\src\general\event\wdm\objchk_wxp_x86\i386\event.pdb pdb sig: C78FF21D-C5AE-49E3-8E51-18CD585960D7 age: 1Loaded pdb is c:\users\jiangminghua\desktop\event\wdm\objchk_wxp_x86\i386\event.pdbevent.pdb pdb sig: C78FF21D-C5AE-49E3-8E51-18CD585960D7 age: 1MATCH: event.pdb and event.sys为了验证公有符号,无重新加载驱动(需要将event_pub.pdb改名为event.pdb),只要如下操作:
kd> .reload /u event ;卸载私有符号Unloaded eventkd> .reload /f event.sys ;重新加载公有符号kd> ld eventSymbols already loaded for eventkd> lm m eventBrowse full module liststart end module name918bb000 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 0n30kd> !itoldyouso eventevent.sys Timestamp: 5A20EBF6 SizeOfImage: 2900 pdb: c:\winddk\7600.16385.1\src\general\event\wdm\objchk_wxp_x86\i386\event.pdb pdb sig: C78FF21D-C5AE-49E3-8E51-18CD585960D7 age: 1Loaded pdb is c:\users\jiangminghua\desktop\event\wdm\objchk_wxp_x86\i386\event.pdbevent.pdb pdb sig: C78FF21D-C5AE-49E3-8E51-18CD585960D7 age: 1MATCH: event.pdb and event.sys
参考:
Using PDBCopy
Using SymChk
阅读全文
0 0
- 为可执行程序(sys/exe)生成公有调试符号
- QT生成可执行的EXE程序
- 使用exe4j生成exe可执行程序
- 制作一个Flex AIR 程序调用 可执行程序(mxmlc.exe) 并且 生成.as文件并编译为.swf文件
- Matlab GUI程序转换为EXE可执行程序
- VC 生成 exe 可执行程序 然后在cmd窗口调用
- MATLAB生成exe脱离matlab运行可执行程序
- MATLAB生成exe脱离matlab运行可执行程序
- MATLAB生成exe脱离matlab运行可执行程序
- 将DLL项目转换为exe可执行程序
- 将Python.py文件打包为.exe可执行程序
- 如何生成可执行exe文件?
- 如何才能使CMake生成的可执行程序便于调试呢?
- QT打包.exe可执行程序
- 为Qt生成的可执行程序设置图标
- 为Qt生成的可执行程序设置图标
- 为Qt生成的可执行程序设置图标
- 为Qt生成的可执行程序设置图标
- ORB-SLAM2详解1 框架说明
- 打包依赖.aar文件以及坑总结
- codeforces 897 B. Chtholly's request【构造回文数+递推】
- RAC中集合的操作
- Hibernate的学习之路三十二(HQL的聚合函数查询)
- 为可执行程序(sys/exe)生成公有调试符号
- ip
- spark性能优化指南(一)
- js子窗体调用父窗体函数的问题
- 彻底搞懂CNN
- 拦截器中无法注入service
- [RK3399][Android7.1] Uboot重要文件及目录
- FFmpeg接收H.264解码并播放
- 一个Spark推荐系统引擎的实现