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