符號表檔案小知識

2021-07-08 17:27:30 字數 2991 閱讀 3612

1. 符號表是什麼?

.dsym檔案其實是乙個目錄,在子目錄中包含了乙個16進製制的儲存函式位址對映資訊的中轉檔案,所有debug的symbols都在這個檔案中(包括檔名、函式名、行號等),所以也稱之為除錯符號資訊檔案。

注意:

來檢查:

那麼,問題就來了!

2. 符號表有什麼用?

實際上,使用xcode的organizer檢視崩潰日誌時,也自動根據本地儲存的.dsym檔案進行了符號化的操作。

並且,崩潰日誌也有uuid資訊,這個uuid和對應的.dsym檔案是一致的,即只有當三者的uuid一致時,才可以正確的把函式位址符號化。

3. 符號表怎麼生成?

一般地,xcode專案預設的配置是會在編譯後生成.dsym,開發者無需額外修改配置。

專案的build settings

generate debug symbols = yes

debug information format = dwarf with dsym file

採用不同的編譯打包方式,產生的.dsym檔案的路徑也不相同。

下面是幾種常用的編譯打包方式:

1、使用xcodebuild編譯打包

2、使用xcode的archive匯出

3、使用make編譯打包

如果開發團隊不使用xcode編譯打包,而是使用make編譯生成.o檔案,然後打包發布。此時,編譯過程不會有.dsym檔案生成。開發者可以使用dsymutil工具從.o檔案中提取符號資訊。

4. 符號表怎麼用?

在前面的內容可以知道,符號表的作用是把崩潰中的函式位址解析為函式名等資訊。

如果開發者能夠獲取到崩潰的函式位址資訊,就可以利用符號表分析出具體的出錯位置。

xcode提供了幾個工具來幫助開發者執行函式位址符號化的操作。

例如,崩潰問題的函式位址堆疊如下:

錯誤位址堆疊

3  corefoundation           0x254b5949 0x253aa000 + 1096008

4 corefoundation 0x253e6b68 _cf_forwarding_prep_0 + 24

5 supersdktest 0x0010143b 0x000ef000 + 74808

符號化堆疊

3   corefoundation          0x254b5949 + 712

4 corefoundation 0x253e6b68 _cf_forwarding_prep_0 + 24

5 supersdktest 0x0010143b -[viewcontroller didtriggerclick:] + 58

說明:

大部分情況下,開發者能獲取到的都是錯誤位址堆疊,需要利用符號表進一步符號化才能分析定位問題。

部分情況下,開發者也可以利用backtrace看到符號化堆疊,可以大概定位出錯的函式、但卻不知道具體的位置。通過利用符號表資訊,也是可以進一步得到具體的出錯位置的。

目前,許多崩潰監控服務都顯示backtrace符號化堆疊,增加了可讀性,但分析定位問題時,仍然要進一步符號化處理。

崩潰資訊的uuid

下面,利用兩個工具來進行一下符號化的嘗試:

1、symbolicatecrash

symbolicatecrash是乙個將堆疊位址符號化的指令碼,輸入引數是蘋果官方格式的崩潰日誌

及本地的.dsym檔案,執行方式如下:

使用symbolicatecrash工具的限制就在於只能分析官方格式的崩潰日誌,需要從具體的裝置中匯出,獲取和操作都不是很方便,而且,符號化的結果也是沒有具體的行號資訊的,也經常會出現符號化失敗的情況。

實際上xcode的organizer內建了symbolicatecrash工具,所以開發者才可以直接看到符號化的錯誤日誌。

2、atos

更普遍的情況是,開發者能獲取到錯誤堆疊資訊,而使用atos工具就是把位址對應的具體符號資訊找到。

atos實際是乙個可以把位址轉換為函式名(包括行號)的工具,它的執行方式如下:

$ xcrun atos -o executable -arch architecture -l loadaddress

address ...

說明:

loadaddress 表示函式的動態載入位址,對應崩潰位址堆疊中 + 號前面的位址,即0x000ef000

address 表示執行時位址、對應崩潰位址堆疊中第乙個位址,即0x0010143b

實際上,崩潰位址堆疊中+號前後的位址相加即是執行時位址,即0x000ef000 + 74808 = 0x0010143b

執行命令查詢位址的符號,可以看到如下結果:

0x0010143b

-[viewcontroller didtriggerclick:] (in supersdktest) (viewcontroller.m:35)

開發者在具體的運用中,是可以通過編寫乙個指令碼來實現符號化錯誤位址堆疊的。

5. 結語

在實際的專案開發中,崩潰問題的分析定位都不是採用這種方式,因為它依賴於系統記錄的崩潰日誌或錯誤堆疊,在本地開發除錯階段,是沒有問題的。

目前,國內外提供崩潰監控服務的產品有好幾個,在崩潰問題的統計上可能不分伯仲。但提供自動符號化功能的產品卻基本沒有,大部分崩潰問題的堆疊只是簡單符號化以增強可讀性,沒有可以快速定位問題的行號資訊。

源**:

Linux 檢視檔案符號表

功能 列出.o a so中的符號資訊,包括諸如符號的值,符號型別及符號名稱等。所謂符號,通常指定義出的函式,全域性變數等等。使用nm options filename 可用的options a 該符號的值在今後的鏈結中將不再改變 b 該符號放在bss段中,通常是那些未初始化的全域性變數 d 該符號放...

邏輯符號表

邏輯符號表 跳轉到 導航,搜尋 在邏輯中,經常使用一組符號來表達邏輯結構。因為邏輯學家非常熟悉這些符號,他們在使用的時候沒有解釋它們。所以,給學邏輯的人的下列 列出了最常用的符號 它們的名字 讀法和有關的數學領域。此外,第三列包含非正式定義,第四列給出簡短的例子。要注意,在一些情況下,不同的符號有相...

數學符號表

符號 名稱定義 舉例讀法 數學領域 等號y xy1 1 2 等於所有領域 不等號x y xy 不等於 所有領域 嚴格不等號 xyx3 4 5 4 小於,大於 序理論 不等號x y x yx 3 4 5 5 5 4 5 5 小於等於,大於等於 序理論 加號 4 6 表示 4 加 6。2 7 9加算術 ...