作者: Eli Bendersky 原文網址: http://eli.thegreenplace.net/2011/02/07/how-debuggers-work-part-3-debugging-information/ 這篇文章是"除錯器如何工作"系列文章的第三篇。在閱讀前,確定你有看過 第一篇 與 第二篇 。 在這篇文中 我將會解釋除錯器如何設法找出C函式與變數所關聯的機器碼,以及它用來對應C原始碼與機器語言間的資料。 除錯資訊 現代編譯器很好地將你所縮排得很好的、巢狀的結構以及各種型別的變數所構成的高階程式轉換成一大坨機器碼,目的就是為了在目標CPU上跑得盡可能地快。很多C代碼轉變成多條機器指令。變數被擠壓在不同空間 - 堆疊、暫存器或完全被最佳化掉。structures跟objects並不存在這些結果裡 - 它們純粹是抽象的,最後是被轉換成記憶體中的位移而已。 好吧,那麼當你要求除錯器停在某個函式的入口,它是如何知道要停在哪邊呢?當你要求某個變數的數值時,它又是如何知道要如何顯示呢?答案是 - 除錯資訊。 除錯資訊是編譯器產生機器碼時同時產出的。它是可執行程式與原來的程式碼間的對應關係。這個資訊被編碼成事先定義好的格式,與機器碼共存。在許多不同的平台與執行檔類型中,多年來有許多這類的除錯格式被創造出來。既然這篇文章的目的不是研究這些格式的歷史,而是展現它們是如何工作,我們必須選定一些格式。這個格式就是DWARF,它在現今廣泛地被使用在Linux ELF 可執行檔與其他 Unix 的環境中。 ELF中的DWARF 根據 維基百科 , DWARF 是搭配著ELF一起設計的,雖然理論上它可以被嵌入其他類型的物件檔中[1]。 DWARF 是一個複雜的格式,依據多年來為了不同架構與作業系統所設計的其他數種格式的經驗而打造。它必須這麼複雜,因為它要解決非常精妙的問題 - 提供除錯資訊,能將任何的高階語言對應到除錯器,並支援任何平台與 ABI 。它需要比此篇簡陋的文章還多上許多的份量才能完整描述,而且老實說,我並不了解它的所有隱晦細節[2]。在這篇文章中,我會採取比較實務的作法,描述剛剛好足夠的DWARF來解釋除錯資訊在實務上是如何運作的。 ...