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