2013-01-17 46 views
3

在Xcode中,您可以設置帶有評估拋出異常的描述的條件的斷點,以確定是否停止該斷點。這在使用核心數據時特別有用,因爲核心數據將內部異常作爲控制流機制引發,並且您希望停止執行異常,而不是核心數據。 (注意:如果您想知道如何按照所述過濾異常,則在SO問題Ignore certain exceptions when using Xcode's All Exceptions breakpoint上回答)。區分iOS模擬器和LLDB中的設備

但是,這些過濾器通常依賴於寄存器的內容,因爲異常的地址存儲在那裏。在模擬器(運行在Intel架構上)中,寄存器爲$eax,但在設備上(ARM架構),它的編號爲$r0

是否有可能制定一個區分這兩種架構的表達式,以便一個表達式使用正確的寄存器,而不管當前正在使用的架構如何?

回答

1

lldb爲體系結構提供了方便的寄存器名稱,這些名稱傳遞了寄存器中的值 - 例如,第一個參數爲arg0。然而,標準的i386 ABI沒有在寄存器中傳遞參數,它們被傳遞到堆棧上(由於通用寄存器的數量很少,這並不奇怪)。

eax(在I386 ABI揮發性/非被調用方保存REG)對進入objc_exception_throw相關性的價值,這一事實表明,Objective-C運行(libobjc)正在做一些非標準的函數調用在其內部例程之間,可能是爲了效率。您無法使用另一個模塊中的非標準ABI調用例程。

如果你在談論兩個在寄存器中傳遞參數的ABI,比如說x86_64和arm,那麼你會很滿意lldb的arg0便利變量。

如果您在命令行中使用lldb,則可以編寫一個Python函數,根據體系結構獲取r0eax,並獲取異常名稱以決定斷點是否應該繼續。但我不認爲Xcode(今天)爲您提供了一種將python命令放在斷點上並控制過程是否恢復的方法。

+0

你將如何去做一個Python腳本?我假設有一種方法可以將Python代碼自動加載到在Xcode中運行的LLDB中,並且斷點可以在LLDB中運行任意命令。你可能直接在LLDB命令中直接將條件轉換爲Python代碼? – jcoleman

相關問題