Xcode等效于'__asm int 3 / DebugBreak()/停止吗?
在Xcode中造成硬中断的指示是什么?例如,在Visual Studio下,我可以执行'_asm int 3'或者'DebugBreak()'。在某些GCC实现中,它是asm(" break 0")或者asm(" trap")。
我在Xcode下尝试了各种组合,但没有任何运气。 (内联汇编程序工作正常,所以这不是语法问题)。
供参考,这是一个断言宏。我不想同时使用assert.h中的定义来实现可移植性,并且因为它们似乎在XCode提供的版本中使用了abort()。
John Super,加油。作为参考,int 3语法是Intel Macs和iPhone所需的一种。
克里斯(Chris)感谢评论,但是有很多原因需要避免将标准的assert()函数用于移植到不同平台的代码库。如果我们遇到了无法确定自己的断言的麻烦,那通常是因为我们希望保留其他功能(日志记录,堆栈展开,用户交互)。
我们关于尝试通过实现'__assert'或者类似方法来替换处理程序的建议将不会移植。标准的'assert'通常是一个宏,尽管在Mac上它可能映射到__assert,但在其他平台上却没有。
解决方案
回答
我在Apple论坛中找到了以下内容:
Xcode doesn't come with any symbolic breaks built in - but they're quick to add. Go to the breakpoints window and add: -[NSException raise]
回答
http://developer.apple.com/documentation/DeveloperTools/Conceptual/XcodeProjectManagement/090_Running_Programs/chapter_11_section_3.html
asm {trap} ; Halts a program running on PPC32 or PPC64. __asm {int 3} ; Halts a program running on IA-32.
回答
我们可以仅插入对Debugger()的调用,这将在调试器中停止应用程序(如果正在调试器中运行),或者如果没有异常则将其暂停。
另外,不要因为"可移植性原因"而避免使用assert()
,这就是它存在的原因!它是Standard C的一部分,无论在哪里找到C编译器,都可以找到它。我们真正想做的是定义一个新的断言处理程序,该断言处理程序可以使调试器中断,而不是调用abort()
。几乎所有的C编译器都提供了一种我们可以执行此操作的机制。
通常,这是通过简单地实现此原型之后的函数或者宏来完成的:
void __assert(const char *expression, const char *file, int line);
断言表达式失败时调用。通常,它执行的不是" assert()"本身,而是执行" printf()"后跟" abort()"的行为,这是默认记录的行为。通过自定义此函数或者宏,可以更改其行为。
回答
还可以使用以下功能作为跨平台的直接Halt()替代品:
#include <stdlib.h> void abort(void);
如果发生致命断言,我们将其用于iPhone实施的跨平台引擎中。跨Nintendo DS / Wii / XBOX 360 / iOS等的跨平台...