【问题标题】:Breaking into the debugger on iPhone闯入 iPhone 上的调试器
【发布时间】:2009-07-19 02:40:45
【问题描述】:

对于我的 iPhone 项目中的断言宏,我正在寻找一种以编程方式进入调试器的方法。在 Windows (MSVC++) 上,我可以为此目的使用 __debugbreak()。调用此函数将停止我的程序,启动调试器,并显示调用 __debugbreak() 的行的调用堆栈。

有什么类似于 iPhone 的 __debugbreak() 的吗?我已经尝试过 Debugger(),但这给了我一个链接器错误。

谢谢, 克劳斯

【问题讨论】:

    标签: iphone debugging assert


    【解决方案1】:

    编辑

    事实证明这也有效:

    #define Debugger() { raise( SIGINT ) ; }

    我认为这是相同的原则。


    我用这个:

    #define Debugger() { kill( getpid(), SIGINT ) ; }

    我认为它有效 在模拟器和设备上..无需组装!

    【讨论】:

    • 我可以确认这在设备和模拟器上都能完美运行。非常感谢!希望我可以将其标记为已接受...
    【解决方案2】:

    Apple 开发者论坛上的一位乐于助人的人向我提供了在设备上运行时使用 asm("trap") 和在模拟器上运行时使用 asm("int3") 的提示。如果您以调试模式 (Option-Command-Y) 启动程序,这会使程序进入调试器。

    __builtin_trap() 也闯入调试器,但之后无法继续。assert(false) 用消息终止程序,但不闯入调试器。)

    【讨论】:

    • asm("trap") 对我不起作用,仅供参考。它的行为方式与 assert.h 中的 assert 相同(触发时无法继续)。
    【解决方案3】:

    首先在您的调试目标上添加-DDEBUGOTHER_CFLAGS;这将在构建调试版本时定义 DEBUG 符号。

    然后在你的前缀头中添加一个简单的断言宏:

    #ifdef DEBUG
    #define MyAssert(val) _MyAssert(val)
    #else
    #define MyAssert(val) do { } while(0)
    #endif
    

    接下来在某处的模块中创建一个_MyAssert 函数:

    #ifdef DEBUG
    void _MyAssert(int expression)
    {
        if (expression == 0) {
           NSLog(@"Assertion failed!"); // Place breakpoint here
        }
    }
    #endif
    

    最后在NSLog 行上创建一个断点。

    【讨论】:

    • 为我工作。我还要注意,上面列出的代码会给出“隐式声明”编译器警告。在#ifdef DEBUG.. void _MyAssert(int val); 正上方添加函数声明此外,对于一个 iPhone 项目,我发现将函数实现放在 main.c 中效果很好。
    【解决方案4】:

    我只是在我想停止的地方设置了一个断点。 Xcode 会永久记住断点,因此每当我使用 gdb 运行应用程序时,它都会在该点停止。

    如果您想在断言失败时中断,设置断点的好地方是在 Objective-C 运行时中的函数 objc_exception_throw 上,这实际上是引发异常的地方。使用 Run > Show > Breakpoints 窗口并双击“Double-click for symbol”行,然后输入名称。

    【讨论】:

    • 手动设置断点不是断言的选项,因为这些断言无处不在。我正在寻找一种在我的代码中按需触发中断的方法。
    【解决方案5】:

    简单的 assert() 宏有什么问题吗?类似的东西

    assert(pointerToTest != nil);
    

    如果条件不成立,将在此时停止您的进程。如果在调试器下运行,您将看到导致断言失败的调用的堆栈跟踪。如果你想在每次点击某个代码路径时触发它,你可以这样做

    assert(false);
    

    我发现这些断言对于在从 NIB 调出窗口或视图时验证所有 IBOutlets 是否非零非常有用。

    【讨论】:

    • 我认为问题在于您无法通过此方法在调试器中恢复执行。
    【解决方案6】:

    如果您在调试中运行程序,您的应用应在遇到无效断言时启动调试器。

    要让它停止,正如 Jens Alfke 所说,您需要启用“在 Objective-C 异常时停止”(在“运行”菜单下)。

    有关调试与发布和断言的更多信息,请阅读http://myok12.wordpress.com/2010/10/10/to-use-or-not-to-use-assertions/

    【讨论】:

      【解决方案7】:

      虽然是一个古老的线程,但在研究 Xcode 7 的同一主题时发现了这一点。为我解决这个问题的是一个名为“创建异常断点...”的功能

      调试 > 断点 > 创建异常断点...

      这会在 Breakpoint Navigator 中放置一个特殊的断点(在 View > Navigator > Show Breakpoint Navigator 下)。

      这会在实际抛出异常时中断:

      [ exception raise ]
      

      无需终止您的代码执行。如果你的代码是这样的结构,你可以继续。

      双击“所有异常”旁边的断点标记可让您调整异常断点停止的位置和方式:

      【讨论】:

        【解决方案8】:
        猜你喜欢
        • 1970-01-01
        • 2021-10-19
        • 2015-03-02
        • 2015-03-02
        • 2011-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多