2016-10-13 46 views
0

我使用CAV for iOS編碼,使用某些iOS框架(如AVAudioPlayer)。我知道這些可以在內部觸發C++異常,並且它非常好,因爲它們捕獲並處理它們。Xcode所有異常斷點 - 忽略某些C++異常

我想使用Xcode中的所有異常斷點來斷開自己的C++代碼中的崩潰問題,但忽略AVAudioPlayer的C++異常(以及基本上所有其他捕獲的異常)。

我該如何做到這一點?

回答

1

使用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有不同的方式來處理它所管理的斷點的命令。

+0

哇,這聽起來很棒。也許有了這個技巧,我也可以找出導致問題的AVAudioPlayer的模塊名稱,只是手動禁用這個單一的東西....我從來沒有用Python腳本lldb,所以我會花一些時間來擺弄這個並試圖讓它運行... – keyboard

+0

我得到它的工作。我在這篇文章中使用了你的解決方案和解決方案的混合體:http://stackoverflow.com/questions/14370632/ignore-certain-exceptions-when-using-xcodes-all-exceptions-breakpoint 我使用了debugger.SetAsync( True) debugger.HandleCommand(「continue」)跳過斷點。不太確定這是否比您建議的更糟糕;)但是可以像其他人那樣在Xcode中添加腳本。 – keyboard

+0

我已經設置它來跳過由「AudioToolbox」引起的任何斷點。是否有可能更具體,只跳過這個問題?是否有可能找出當前的功能或類似的東西? – keyboard