天天看點

為可執行程式(sys/exe)生成公有調試符号

    自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需要替換成你要生成的公有符号名.

為可執行程式(sys/exe)生成公有調試符号

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      

這樣就會生成公有符号,如下圖:

為可執行程式(sys/exe)生成公有調試符号

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      

參考:

繼續閱讀