关于macOS:等效于’__asm int 3 / DebugBreak()/ Halt的Xcode?

关于macOS:等效于’__asm int 3 / DebugBreak()/ Halt的Xcode?

Xcode equivalent of ' __asm int 3 / DebugBreak() / Halt?

在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()函数用于移植到不同平台的代码库。如果您遇到了无法确定自己的断言的麻烦,那通常是因为您希望保留其他功能(日志记录,堆栈展开,用户交互)。

您关于尝试通过实现'__assert'或类似方法来替换处理程序的建议将不会移植。标准的'assert'通常是一个宏,尽管在Mac上它可能映射到__assert,但在其他平台上却没有。


http://developer.apple.com/documentation/DeveloperTools/Conceptual/XcodeProjectManagement/090_Running_Programs/chapter_11_section_3.html

1
2
3
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编译器都提供了一种您可以执行此操作的机制。

通常,这是通过简单地实现此原型之后的函数或宏来完成的:

1
void __assert(const char *expression, const char *file, int line);

断言表达式失败时调用。通常,它执行的是默认记录的行为" printf()后跟abort()"而不是assert()本身。通过自定义此函数或宏,可以更改其行为。


1
__builtin_trap();

由于Debugger()现在已贬值,因此应该可以使用。

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


为了后人:我有一些代码可在调试器中的正确堆栈帧处生成暂停,并(可选)暂停应用程序,以便您可以及时附加调试器。适用于模拟器和设备(如果需要,可能还适用于台式机)。详尽详尽的帖子,位于http://iphone.m20.nl/wp/2010/10/xcode-iphone-debugger-halt-assertions/


1
kill(getpid(), SIGINT);

可在模拟器和设备中使用。


我在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]


作为跨平台的直接Halt()替代品,还可以使用以下函数:

1
2
3
#include <stdlib.h>

void abort(void);

如果发生致命断言,我们将其用于iPhone实施的跨平台引擎中。跨Nintendo DS / Wii / XBOX 360 / iOS等的跨平台...


推荐阅读