簡體   English   中英

如何從obj-c / ios中的堆棧跟蹤獲取源代碼行

[英]How to get source code line from stack trace in obj-c / ios

我使用NSSetUncaughtExceptionHandler將堆棧跟蹤打印到iPhone中的本地文件,這將在下次啟動應用程序時發送到我們的服務器。 然后我可以檢查異常數據並修復bug。 在一些崩潰中,我有模塊名稱和拋出異常的函數,這些很容易。 但大多數情況下我有這樣的事情:

"4   libc++abi.dylib 0x35bba3c5 _ZL19safe_handler_callerPFvvE + 76",
"5   libc++abi.dylib 0x35bba451 _ZdlPv + 0",
"6   libc++abi.dylib 0x35bbb825 __cxa_current_exception_type + 0",
"7   libobjc.A.dylib 0x37bab2a9 objc_exception_rethrow + 12",
"8   CoreFoundation  0x3575a50d CFRunLoopRunSpecific + 404"

例如:

*** -[__NSArrayI objectAtIndex:]: index 0 beyond bounds for empty array

但是我的應用程序中有幾十個數組,所以我需要幫助才能找到引發異常的特定行,使用從堆棧跟蹤中獲取的數據。

有沒有人知道來自Apple或其他的好文章/教程,在那里我可以學習解碼堆棧跟蹤中的數字以找到源代碼中有問題的行。 提前致謝!

我強烈建議在Xcode中啟用Exception Breakpoint。 它將停止在崩潰應用程序的確切行上執行代碼。 因此,您無需擔心崩潰導致的陣列原因。 *** - [__ NSArrayI objectAtIndex:]:索引0超出空數組的邊界

添加異常斷點

  1. 轉到Xcode上的Breakpoints部分
  2. 單擊該部分底部的加號
  3. 選擇“添加異常斷點”

異常BreakPoint

我不知道如何從堆棧跟蹤中獲取行號(但是),但在我想要獲取行號的代碼中的某些點我使用了以下代碼片段:

NSLog(@"%s line=%d", __func__, __LINE__);

這將給出以下輸出:

2013-04-01 00:16:46.393 MyApp[847:c07] -[AppDelegate application:didFinishLaunchingWithOptions:] line=29

如果您熟悉Log4J框架,我建議您查看Lumberjack框架,該框架在各種項目中對我非常有幫助。

https://github.com/robbiehanson/CocoaLumberjack

雖然這可能無法直接回答您的問題,但它只是提醒您。

在catch塊中設置斷點,一旦代碼流停止,就可以使用像'bt'這樣的gdb命令。

打印存儲在異常中的堆棧跟蹤,即[exception callStackSymbols][exception callStackReturnAddresses] 在自iOS 5以來的Apple崩潰日志中,它在頂部顯示為“Last Exception Backtrace”。

你所看到的是重新拋出異常時的調用堆棧,這將發生在像try...finally這樣簡單的事情上。 我不確定為什么Apple做出這樣的改變(可能使運行循環異常安全?),但是你去了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM