2014-06-25 103 views
1

轉換爲方法名稱在生產應用與剝離出去的調試信息,你怎麼的輸出轉換:的iOS:堆棧跟蹤進入行號

NSLog(@"Stack Trace: %@", [exception callStackSymbols]); 

要一個清晰的類和方法的名字嗎?行號將是一個祝福。

這裏是我得到的輸出:

0 CoreFoundation      0x23d82f23 <redacted> + 154 
1 libobjc.A.dylib      0x23519ce7 objc_exception_throw + 38 
2 CoreFoundation      0x23cb92f1 <redacted> + 176 
3 MyApp        0x23234815 MyApp + 440341 

的最後一行是麪包,黃油線,但是當我使用矮人找到地址,什麼都不存在。

dwarfdump --arch armv7 MyApp.dSYM --lookup 0x00234815 | grep 'Line table' 

我在這裏讀了你需要的堆棧地址轉換爲矮化或ATOS別的東西:

https://stackoverflow.com/a/12464678/2317728

我怎麼會找到加載地址或幻燈片地址進行如何計算?在將堆棧跟蹤從應用程序發送到日誌之前,沒有辦法計算所有這些嗎?如果不是,我將如何在收到堆棧跟蹤後確定並計算這些值?更好的是,我錯過了一個更簡單的解決方案嗎?

注意我不能等待崩潰報告,因爲該應用程序很小,他們永遠不會來。我計劃將堆棧跟蹤發送到我們的服務器,一旦出現就立即修復。

社論的iOS

的崩潰報告工具是非常粗糙的,尤其是當相比於Android系統。在android中,bug行被髮送到谷歌分析,您使用地圖來調試線 - 簡單(比較)。對於iOS,您面臨以下問題:a)等待用戶錯誤報告(對於小應用程序不合理); b)將堆棧跟蹤發送到服務器,但沒有足夠的工具或有關如何符號化堆棧跟蹤的信息; c)依賴在大型準商業第三方圖書館。這肯定會讓它難以建立和擴大規模 - 希望蘋果最終會注意到這一點。更有希望的人發現了我可能錯過的更簡單的解決方案;)

感謝您的幫助!

+2

有你看着https://www.plcrashreporter.org/它支持許多這些商業崩潰報告服務?這聽起來像你可能會試圖重塑大部分的工具。 – Jonah

+0

感謝您的建議 - 它們看起來很不錯,但該項目的大小是我應用程序大小的幾倍。如果我能弄清楚如何將輸出轉換爲可理解的內容,那麼服務器的內容只需要30分鐘,而且我可以避免將大型第三方代碼庫添加到項目中。 –

+1

一些注意事項:1.您只會通過此機制獲得帶有異常的報告,而不會由信號處理程序引起崩潰。 2.爲了表示'callStackSymbols'的數據,你需要編寫你自己的解析器和邏輯,並使用帶有正確參數的'atos'。 3. PLCrashReporter的大小究竟是什麼?代碼,靜態庫二進制文件?除非您鏈接並檢查,否則兩者都不會提示您的應用會變得多大。 4.發生異常時發送崩潰報告是一個壞主意。 5.崩潰/異常與您從Android中知道的方式不同。不要使用相同的方法! – Kerni

回答

0

一個建議,你可以用輕鬆地獲得方法名,異常原因和行號:

NSLog(@"%@ Exception in %s on %d due to %@",[exception name],__PRETTY_FUNCTION__,__LINE__,[exception reason]); 
+0

謝謝我添加了.name和.reason。其餘的不幸指向我的異常處理程序中的行。我也不認爲它可以用於生產應用程序中的符號。 –