要使用上Windows平臺(tái)提供的豐富工具,需要LLVM等編譯器編寫者可以生成PDB格式的文件。PDB,即程序調(diào)試數(shù)據(jù)庫(kù)(Program Debug Database),是一種字符數(shù)據(jù)庫(kù),它描述了Windows平臺(tái)上編譯的代碼。由于PDF文件中包含了各種類型的記錄,因此它使得調(diào)試器等工具可以實(shí)現(xiàn)被編譯代碼和源代碼間的映射。
出于提高性能的考慮,PDB中的記錄數(shù)據(jù)是高度索引的。問(wèn)題也正部分源于此,LLVM的Windows團(tuán)隊(duì)成員Zach Turner給出了如下介紹:
CodeView是Microsoft在上世紀(jì)八十年代創(chuàng)立的一種調(diào)試信息格式。但是出于種種原因,其它的調(diào)試器另外開發(fā)了一種稱為DWARF的獨(dú)立格式。DWARF格式最終成為了標(biāo)準(zhǔn),當(dāng)前得到了很多編譯器和編程語(yǔ)言的支持。類似于DWARD,CodeView定義了一系列記錄,描述了源代碼行和代碼地址間的映射,以及程序所使用的類型和符號(hào)。調(diào)試器進(jìn)而使用這些信息,讓用戶可以實(shí)現(xiàn)通過(guò)函數(shù)名設(shè)置斷點(diǎn)、顯示變量的值等調(diào)試功能。但是CodeView的文檔并不完整,而且最新的官方文檔也是20年前的。盡管一些記錄的格式并未發(fā)生變化,但是其它不少記錄的格式已經(jīng)進(jìn)化了,并引入了全新記錄。這些記錄的文檔并不存在。
[……]
(PDB中)包括了CodeView,此外還包括了很多其它的內(nèi)容,以允許使用各種方式索引CodeView記錄。這使得PDB可以支持通過(guò)名字和地址對(duì)類型和符號(hào)的快速查找、對(duì)于單個(gè)輸入文件建立類似于“數(shù)據(jù)表”的功能,以及其它多種功能,這些功能雖然對(duì)用戶是不可見的,但是它們?cè)诤艽蟪潭壬蠈?shí)現(xiàn)了Windows上所提供的無(wú)與倫比的調(diào)試體驗(yàn)。
Microsoft提供了一些操作PDB文件的工具和SDK,但是并未提供任何可以生成PDB文件的工具。即便是這些工具,也需要使用一些專用庫(kù),因?yàn)殚_源PDB代碼甚至從未得以編譯。
根據(jù)由Microsoft上傳的部分代碼,LLVM團(tuán)隊(duì)構(gòu)建了自己的PDB生成器。雖然該生成器依然被認(rèn)為是處于“試用版的質(zhì)量”,但是它支持應(yīng)用使用CLANG和LLVM后端編譯,可以開始與Windows工具合作工作。Turner繼續(xù)指出:
我們希望用戶能嘗試使用該工具,并在我們的軟件缺陷跟蹤網(wǎng)站上報(bào)告問(wèn)題。但是開始時(shí),你需要下載用于Windows平臺(tái)Clang的最新快照。
作為L(zhǎng)LVM團(tuán)隊(duì)支持PDB格式的探索性工作的一部分,LLVM構(gòu)建了PDB格式的文檔。雖然這些文檔并非十分完善,但是對(duì)于查看這一從前并不可用的復(fù)雜格式,上述文檔提供了一個(gè)重要的窗口。
作為文檔的輔助工具,LLVM團(tuán)隊(duì)還構(gòu)建了一個(gè)稱為llvm-pdbutil的工具。該工具的功能之一就是支持在YAML和PDB間的雙向轉(zhuǎn)換。(在此對(duì)不了解YAML的讀者做一個(gè)簡(jiǎn)介。YAML是一種人們可閱讀的格式,它使用的是空格而非大括號(hào)。YAML可能是在API文檔語(yǔ)言RAML所用的格式中最廣為人知的。)
需指出的是,現(xiàn)實(shí)中存在著兩種PDB格式。除了我們上面介紹的PDB完整版,還有一種稱為Portable PDB的格式,該格式針對(duì).NET Core應(yīng)用。為方便閱讀,Portable PDB的文檔使用了開源庫(kù)。
查看英文原文: LLVM has Documented the PDB Format, Complete with PDB to YAML Conversion