在iPhone上打破调试器

时间:2009-07-19 02:40:46

标签: iphone debugging assert

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

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

谢谢, 克劳斯

8 个答案:

答案 0 :(得分:26)

修改

事实证明这也有效:

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

我认为这是相同的原则。


我用这个:

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

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

答案 1 :(得分:6)

Apple开发人员论坛上有帮助的人给了我在设备上运行时使用asm("trap")的提示以及在模拟器上运行时使用asm("int3")的提示。如果您以调试模式启动程序(Option-Command-Y),这会使程序进入调试器。

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

答案 2 :(得分:1)

首先在调试目标上添加-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行创建一个断点。

答案 3 :(得分:0)

我只是在我要停止的地方设置断点。 Xcode会持续记住断点,因此每当我使用gdb运行应用程序时,它都会在此时停止。

如果你想打破断言失败,设置断点的好地方是在Objective-C运行时的函数objc_exception_throw上,这实际上是抛出异常。使用Run>显示> “断点”窗口,然后双击“双击符号”行,然后键入名称。

答案 4 :(得分:0)

答案 5 :(得分:0)

简单的assert()宏有什么问题吗?像

这样的东西
assert(pointerToTest != nil);
如果条件不正确,

将暂停您的过程。如果在调试器下运行,您将看到一个导致失败的断言的堆栈跟踪调用。如果你想在每次点击某个代码路径时触发它,你可以做

assert(false);

我发现这些断言对于验证从NIB启动窗口或视图时所有IBOutlet都是非零非常有用。

答案 6 :(得分:0)

如果您在调试中运行程序,则应用程序应在调试程序无效时启动调试程序。

要停止,正如Jens Alfke试图说的那样,你需要启用“停止Objective-C例外”(在“运行”菜单下)。

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

答案 7 :(得分:0)

虽然是一个古老的线程,但是在为Xcode 7研究相同的主题时发现了这个。为我解决这个问题的是一个名为“Create Exception Breakpoint ...”的功能

  

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

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

breakpoint navigator pane showing All Exceptions breakpoint

这打破了异常的实际抛出:

[ exception raise ]

不终止代码执行。如果您的代码结构如此,您可以继续。

双击“All Exception”旁边的断点标记,可以调整异常断点停止的位置和方式:

break point navigator showing options on for how and when breakpoint occurs