簡體   English   中英

Xcode 異常斷點不打印拋出異常的詳細信息

[英]Xcode exception breakpoint doesn't print details of the exception being thrown

總結

當我設置異常斷點時,我沒有收到異常消息。 如何獲取異常消息? 我已經知道如何獲取堆棧跟蹤,但這不包括異常消息。

細節

過去我使用 Xcode 開發 iOS 應用程序,當出現問題時,我會收到錯誤/異常。 異常通常會出現“不能取消引用 null”之類的消息。

現在,過去幾周使用 Xcode 4.6.x,我從未收到過異常消息。 我經常會收到 SIGABRT。 我在異常斷點處設置了中斷,它會在那里中斷,但它在 iOS SDK 中的某些程序集中關閉,我從未收到消息。

事實上,我不記得上次在調試器控制台中看到任何東西是什么時候了。

遷移到 LLVM 時異常信息是否消失了?

讓我的應用程序在不知道原因的情況下在 SDK 中崩潰是非常令人沮喪的。 我檢查最后一個函數以確保設置正確(分配的對象等),這意味着我沒有任何線索。

是否可能是過去保留的構建設置以某種方式關閉了異常消息?

請重新提問。 現在有了答案!

在評論中已經給出了很好的答案。 這應該提升為完整答案,這樣我就可以標記已回答的問題,並且其他有此常見問題的人可以找到它。 為了做到這一點,需要重新打開這個問題! (在那之后我會刪除這個請求。)

我將在這里更新傑夫的回答:

突出顯示導致異常(而不是 main.m 中的 UIApplicationMain())並查看異常原因(例如,“錯誤:獲取請求必須具有實體。”),請執行以下操作:

  • 在斷點導航器中:
    1. 添加(+),添加異常斷點
    2. 選擇新斷點,按住 Control 鍵單擊,編輯斷點
    3. 添加操作
    4. 輸入: po $arg1

堆棧跟蹤的相關部分將在導航器區域中。

這似乎在 Xcode 9 中仍然有效

這是我添加的用於 Xcode 6 及以下版本的內容。

  1. 輸入: po (NSException*) $eax

在 Xcode 6 中,您必須明確提供對象類型,因為它不再被推斷。

對於 Xcode 7-9(基於 Jeff 的回答):

在斷點導航器中:

  1. 添加(+),添加異常斷點
  2. 選擇新斷點,按住 Control 鍵單擊,編輯斷點
  3. 添加操作
  4. 輸入: po $arg1

突出顯示導致異常(而不是 main.m 中的 UIApplicationMain())並查看異常原因(例如,“錯誤:獲取請求必須具有實體。”),請執行以下操作:

  • 在斷點導航器中:
    1. 添加(+),添加異常斷點
    2. 選擇新斷點,Contorl-Click,Edit Breakpoint
    3. 添加操作
    4. 輸入: po $eax

堆棧跟蹤的相關部分將在導航器區域中。

是的 xcode 對調試不太友好。 我喜歡這篇文章,它可以幫助我更清楚地理解崩潰日志)) 揭秘 iOS 應用程序崩潰日志

如果您看到錯誤“消息發送到已釋放的實例”,也請執行此操作

'產品 -> 編輯方案 -> 啟用僵屍對象'

這將啟用僵屍對象,當你對你的項目進行配置時選擇“僵屍”,導致錯誤,你將能夠看到哪些對象被釋放,例如 NSArray *myArray

如果沒有設置異常斷點,我從po $eaxpo (NSException *)$eax似乎與 Xcode 打印的不同。 所以我做以下,

  1. 添加異常斷點
  2. 發生異常,斷點被擊中 ->我知道位置
  3. 暫時禁用斷點(調試區域左側的第二個按鈕)
  4. 繼續程序執行(Debug區左側第三個按鈕)
  5. 打印詳細信息 ->我知道原因

顯然不是很優雅和靈活,但至少我回答了兩個大問題(在哪里和為什么)。

您可以使用btthread backtrace命令打印錯誤跟蹤

顯示當前線程的堆棧回溯。

您可以在崩潰報告中找到的相同堆棧跟蹤

在此處輸入圖片說明

有關當前線程的信息使用currentThread

//Objective-C
po [NSThread currentThread]

//Swift
po Thread.currentThread

*有時您可以在po不工作時使用fr v (或僅使用 XCode 10.2 中的v

暫無
暫無

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

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