在Xcode中导致硬破坏的指令是什么?例如,在Visual Studio下,我可以执行'_asm int 3'或'DebugBreak()'。在一些GCC实现下,它是asm(“break 0”)或asm(“trap”)。
我在Xcode下尝试了各种组合而没有任何运气。 (内联汇编程序工作正常,因此它不是语法问题。)
作为参考,这是针对断言宏。我不想在assert.h中使用定义既可移植性,也因为它们似乎在XCode提供的版本中执行了abort()。
Chris - 感谢您的评论,但有很多理由要避免将标准的assert()函数移植到移植到不同平台的代码库。如果你已经解决了滚动自己的断言的麻烦,通常是因为你有其他功能(日志记录,堆栈展开,用户交互)你希望保留。
你试图通过'__sert'或类似的实现替换hander的建议不是可移植的。标准的'assert'通常是一个宏,虽然它可能映射到Mac上的__assert它没有在其他平台上。
答案 0 :(得分:22)
asm {trap} ; Halts a program running on PPC32 or PPC64.
__asm {int 3} ; Halts a program running on IA-32.
答案 1 :(得分:10)
你可以只调用Debugger()
- 这将在调试器中停止你的应用程序(如果它在调试器下运行),或者如果不是则暂停它。
另外,不要因为“便携性原因”而忽略assert()
- 便携性就是它存在的原因!它是标准C的一部分,无论您在哪里找到C编译器,都可以找到它。你真正想要做的是定义一个新的断言处理程序来执行调试器中断,而不是调用abort()
;几乎所有的C编译器都提供了一种机制来实现这一目标。
通常,只需实现遵循此原型的函数或宏即可完成此操作:
void __assert(const char *expression, const char *file, int line);
当断言表达式失败时调用它。通常,它不是assert()
本身,而是执行“printf()
后跟abort()
”,这是默认记录的行为。通过自定义此功能或宏,您可以更改其行为。
答案 2 :(得分:5)
__builtin_trap();
由于Debugger()现在已经过折旧,所以应该可以使用它。
答案 3 :(得分:3)
对于后代:我有一些代码用于在调试器中的正确堆栈帧处生成暂停,并且(可选)暂停应用程序,以便您可以及时附加调试器。适用于模拟器和设备(如果您需要它,可能还有桌面)。详尽的详细信息http://iphone.m20.nl/wp/2010/10/xcode-iphone-debugger-halt-assertions/
答案 4 :(得分:2)
我在Apple Forum中找到了以下内容:
Xcode没有内置任何符号中断 - 但它们是 快速添加。转到断点窗口并添加:
- [NSException raise]
答案 5 :(得分:2)
kill(getpid(), SIGINT);
在模拟器和设备中工作。
答案 6 :(得分:1)
还有以下功能可用作跨平台直接Halt()替代方案:
#include <stdlib.h>
void abort(void);
我们在我们的跨平台引擎中使用它来实现iPhone的致命断言。跨任天堂DS / Wii / XBOX 360 / iOS等跨平台......