Xcode相当于'__asm int 3 / DebugBreak()/ Halt?

时间:2008-09-01 00:18:18

标签: xcode macos debugbreak

在Xcode中导致硬破坏的指令是什么?例如,在Visual Studio下,我可以执行'_asm int 3'或'DebugBreak()'。在一些GCC实现下,它是asm(“break 0”)或asm(“trap”)。

我在Xcode下尝试了各种组合而没有任何运气。 (内联汇编程序工作正常,因此它不是语法问题。)

作为参考,这是针对断言宏。我不想在assert.h中使用定义既可移植性,也因为它们似乎在XCode提供的版本中执行了abort()。


约翰 - 超级,欢呼。作为参考,int 3语法是Intel Macs和iPhone所需的语法。


Chris - 感谢您的评论,但有很多理由要避免将标准的assert()函数移植到移植到不同平台的代码库。如果你已经解决了滚动自己的断言的麻烦,通常是因为你有其他功能(日志记录,堆栈展开,用户交互)你希望保留。

你试图通过'__sert'或类似的实现替换hander的建议不是可移植的。标准的'assert'通常是一个宏,虽然它可能映射到Mac上的__assert它没有在其他平台上。

7 个答案:

答案 0 :(得分:22)

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.

答案 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()现在已经过折旧,所以应该可以使用它。

https://developer.apple.com/library/mac/technotes/tn2124/_index.html#//apple_ref/doc/uid/DTS10003391-CH1-SECCONTROLLEDCRASH

答案 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等跨平台......