闯入iPhone上的调试器

闯入iPhone上的调试器,iphone,debugging,assert,Iphone,Debugging,Assert,对于iPhone项目中的assert宏,我正在寻找一种以编程方式进入调试器的方法。在Windows(MSVC++)上,我可以为此使用_debugbreak()。调用此函数将停止我的程序,启动调试器,并显示调用_debugbreak()行的调用堆栈 iPhone上有类似于_debugbreak()的东西吗?我尝试了Debugger(),但这给了我一个链接器错误 谢谢, 克劳斯我只是在我想停的地方设置了一个断点。Xcode会持久地记住断点,所以每当我用gdb运行应用程序时,它都会在该点停止 如果您想

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

iPhone上有类似于_debugbreak()的东西吗?我尝试了Debugger(),但这给了我一个链接器错误

谢谢,
克劳斯

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


如果您想在断言失败时中断,设置断点的好地方是Objective-C运行时中的函数objc_exception_throw,它实际上会引发异常。使用“运行>显示>断点”窗口,双击“双击符号”行,然后键入名称。

签出条件断点:


首先将
-DDEBUG
添加到调试目标上的
其他标签中;这将在构建调试生成时定义
DEBUG
符号

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

#ifdef DEBUG
#define MyAssert(val) _MyAssert(val)
#else
#define MyAssert(val) do { } while(0)
#endif
接下来,在某个模块中创建一个
\u MyAssert
函数:

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

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

simple assert()宏是否有问题?差不多

assert(pointerToTest != nil);
如果条件不正确,将在该点停止进程。如果在调试器下运行,将显示导致断言失败的调用堆栈跟踪。如果您想在每次点击某个代码路径时触发它,您可以这样做

assert(false);

我发现这些断言对于验证从NIB打开窗口或视图时所有IBoutlet是否为非零非常有用。

苹果开发者论坛上的一位有用人士告诉我,在设备上运行时使用
asm(“trap”)
,在模拟器上运行时使用
asm(“int3”)
。如果在调试模式(选项-Command-Y)下启动程序,则会使程序中断到调试器中

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

编辑

事实证明,这同样有效:

#定义调试器(){raise(SIGINT)}

我认为这是同样的原则


我用这个:

#定义调试器(){kill(getpid(),SIGINT)}

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

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

要让它停止,正如Jens Alfke试图说的那样,您需要启用“在Objective-C异常时停止”(在Run菜单下)


有关调试与释放和断言的更多信息,请阅读《当一个古老的线程在研究Xcode 7的同一主题时发现》一文。为我解决这个问题的是一个名为“创建异常断点…”的功能

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

这会在断点导航器中放置一个特殊断点(在“视图>导航器>显示断点导航器”下)

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

[ exception raise ]
不终止代码执行。如果代码的结构是这样的,您可以继续

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


手动设置断点不是断言的选项,因为这些断言到处都是。我正在寻找一种在我的代码中触发按需中断的方法。对我来说很有用。我还要注意,上面列出的代码将给出“隐式声明”编译器警告。在#ifdef DEBUG.的正上方添加函数声明。。void _MyAssert(int val);另外,对于一个iPhone项目,我发现将函数实现放在main.c中可以很好地工作。我认为问题在于,您无法通过此方法在调试器中恢复执行。asm(“陷阱”)对我不起作用,仅供参考。它的行为方式与assert.h中的assert相同(当它被触发时,您无法继续)。我可以确认,这在设备和模拟器上都能完美地工作。非常感谢!希望我能把它标上接受。。。