我使用CAV for iOS編碼,使用某些iOS框架(如AVAudioPlayer)。我知道這些可以在內部觸發C++異常,並且它非常好,因爲它們捕獲並處理它們。Xcode所有異常斷點 - 忽略某些C++異常
我想使用Xcode中的所有異常斷點來斷開自己的C++代碼中的崩潰問題,但忽略AVAudioPlayer的C++異常(以及基本上所有其他捕獲的異常)。
我該如何做到這一點?
我使用CAV for iOS編碼,使用某些iOS框架(如AVAudioPlayer)。我知道這些可以在內部觸發C++異常,並且它非常好,因爲它們捕獲並處理它們。Xcode所有異常斷點 - 忽略某些C++異常
我想使用Xcode中的所有異常斷點來斷開自己的C++代碼中的崩潰問題,但忽略AVAudioPlayer的C++異常(以及基本上所有其他捕獲的異常)。
我該如何做到這一點?
使用Xcode斷點設置沒有辦法做到這一點。
您可以在lldb中使用C++異常斷點上的Python斷點命令執行此操作。您的回調將查找堆棧以引發異常,並檢查投擲代碼是否在共享庫中,並自動從斷點繼續。
http://lldb.llvm.org/python-reference.html
上運行時,一個斷點時會給你如何做到這一點一些細節的腳本:
中的部分。
舉例來說,你可以把:
module_name = "TheNameOfYourExecutableOrSharedLibrary"
def bkpt_cmd (frame, loc, dict):
global module_name
thread = frame.GetThread()
frame_1 = thread.GetFrameAtIndex(1)
module = frame_1.GetModule()
name = module.GetFileSpec().GetFilename()
if module_name in name:
return True
return False
在一個叫做〜/ bkpt_cmd.py文件。然後在LLDB控制檯中,執行:
(lldb) br s -E c++
Breakpoint 1: no locations (pending).
(lldb) command script import ~/bkpt_cmd.py
(lldb) br com add -F bkpt_cmd.bkpt_cmd
這會設置一個C++異常斷點,只有當上升框架是所謂的「TheNameOfYourExecutableOrSharedLibrary」共享庫觸發...
順便說一句,如果你把在你的.py文件下列DEF:
def __lldb_init_module(debugger, internal_dict):
執行command script import
命令時,它會得到運行,所以你可以使用它來斷點和命令一氣呵成添加到斷點。我將把它作爲讀者的練習。另請注意,這將在Xcode中運行lldb時起作用,但是您希望如上所示創建自己的異常斷點,因爲Xcode有不同的方式來處理它所管理的斷點的命令。
哇,這聽起來很棒。也許有了這個技巧,我也可以找出導致問題的AVAudioPlayer的模塊名稱,只是手動禁用這個單一的東西....我從來沒有用Python腳本lldb,所以我會花一些時間來擺弄這個並試圖讓它運行... – keyboard
我得到它的工作。我在這篇文章中使用了你的解決方案和解決方案的混合體:http://stackoverflow.com/questions/14370632/ignore-certain-exceptions-when-using-xcodes-all-exceptions-breakpoint 我使用了debugger.SetAsync( True) debugger.HandleCommand(「continue」)跳過斷點。不太確定這是否比您建議的更糟糕;)但是可以像其他人那樣在Xcode中添加腳本。 – keyboard
我已經設置它來跳過由「AudioToolbox」引起的任何斷點。是否有可能更具體,只跳過這個問題?是否有可能找出當前的功能或類似的東西? – keyboard