自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 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 - OK
DBGHELP: event - private symbols & lines
C:\Users\jiangminghua\Desktop\event\wdm\objchk_wxp_x86\i386\event.pdb
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.pdb
Unable to enumerate user-mode unloaded modules, Win32 error 0n30
kd> !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: 1
Loaded pdb is c:\users\jiangminghua\desktop\event\wdm\objchk_wxp_x86\i386\event.pdb
event.pdb
pdb sig: C78FF21D-C5AE-49E3-8E51-18CD585960D7
age: 1
MATCH: 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.pdb
Unable to enumerate user-mode unloaded modules, Win32 error 0n30
kd> !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: 1
Loaded pdb is c:\users\jiangminghua\desktop\event\wdm\objchk_wxp_x86\i386\event.pdb
event.pdb
pdb sig: C78FF21D-C5AE-49E3-8E51-18CD585960D7
age: 1
MATCH: event.pdb and event.sys
參考: