Xcode所有异常断点-忽略某些c++异常

Xcode All Exceptions Breakpoint - Ignore Certain C++ Exception

本文关键字:异常 c++ 断点 Xcode      更新时间:2023-10-16

我正在为iOS编写c++代码,使用AVAudioPlayer等某些iOS框架。我知道这些可以在内部触发c++异常,这是非常好的,因为它们捕获并处理它们。

我想在Xcode中使用所有异常断点来打破我自己的c++代码中的崩溃问题,但忽略AVAudioPlayer的c++异常(以及基本上所有其他捕获的异常)。

我怎么才能做到呢?

没有办法使用Xcode断点设置来做到这一点。

您可以在lldb中使用Python断点命令在c++异常断点上执行此操作。您的回调将查找堆栈到抛出异常的点,并检查抛出代码是否在您的共享库中,并从断点自动继续。

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++异常断点,只有当升高帧位于名为" thenameofyoureexecutableorsharedlibrary "的共享库中时才会触发该异常断点…

顺便说一句,如果在.py文件中放入以下定义:

def __lldb_init_module(debugger, internal_dict):

将在执行command script import命令时运行,因此您可以使用它一次性将断点和命令添加到断点。我将把它留给读者作为练习。

请注意,当在Xcode中运行lldb时,这将工作,但你会想要设置自己的异常断点,如上所示,因为Xcode有不同的方式来处理它管理的断点命令。