為可執行程式 sys exe 生成公有除錯符號

2021-08-11 18:48:40 字數 4700 閱讀 8663

自win10推出以來,windows的更新頻度變為每年2次(趕上隔壁ubuntu的更新節奏了)。每次更新,ms都會提出一堆新要求。對於2023年rs4的更新,ms要求所有提交到wu(windows update)的驅動程式,除了要提供驅動包本身,還需要額外提供公有除錯符號。哎,我只能默默的嘆口氣,然後照做了...

工程屬性-linker-command line-additional options 增加選項/pdbstripped:event.pdb 

event.pdb需要替換成你要生成的公有符號名.

你可能會問,既然編譯器有辦法直接生成公有符號,為什麼還要考慮這種方式?額,有時候,某個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

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

對於用上面方法生成的除錯符號,我們不知正確與否,這時就要用到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

當然,也可以用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.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> 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

參考:using pdbcopy

using symchk

PyInstaller生成可執行程式

表 1 pyinstaller 支援的常用選項 h,help 檢視該模組的幫助資訊 f,onefile 產生單個的可執行檔案 d,onedir 產生乙個目錄 包含多個檔案 作為可執行程式 a,ascii 不包含 unicode 字符集支援 d,debug 產生 debug 版本的可執行檔案 w,wi...

PyInstaller生成可執行程式

pyinstaller 選項 python 原始檔例如 進入放置原始碼的資料夾內或者指定原始檔路徑 pyinstaller 源.py或 pyinstaller d 源.py生成單一的exe檔案 pyinstaller f 源.py加入圖示和版本資訊 pyinstaller f w version f...

PyInstaller生成可執行程式

pyinstaller 屬於python第三方庫,使用前需先安裝 pip install pyinstaller pyinstaller 工具的命令語法如下 1 第一種 pyinstaller options myproject source myscript.py 2 第一種 pyinstalle...