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

时间:2016-10-13 15:08:47

标签: c++ ios xcode exception lldb

我使用某些iOS框架(如AVAudioPlayer)在C ++ for iOS中进行编码。我知道这些可以在内部触发C ++异常并且完全正常,因为它们会捕获并处理它们。

我想在Xcode中使用All Exceptions Breakpoint打破我自己的C ++代码中的Crash-Issues,但忽略了AVAudioPlayer的C ++异常(以及基本上所有其他捕获的异常)。

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分: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有一种不同的方式来处理它管理的断点的命令。