对于我的iPhone项目中的断言宏,我正在寻找一种以编程方式进入调试器的方法。在Windows(MSVC ++)上,我可以使用__debugbreak()来实现此目的。调用此函数将停止我的程序,启动调试器,并显示调用__debugbreak()的行的调用堆栈。
与iPhone的__debugbreak()有什么相似之处吗?我已经尝试过Debugger(),但这给了我一个链接器错误。
谢谢, 克劳斯
答案 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)
首先在调试目标上添加-DDEBUG
到OTHER_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)