23

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

我在 Xcode 下尝试了各种组合,但没有任何运气。(内联汇编器工作正常,所以这不是语法问题)。

作为参考,这是一个断言宏。我不想将 assert.h 中的定义用于可移植性,并且因为它们似乎在 XCode 提供的版本中执行 abort()。


约翰 - 超级,干杯。作为参考,int 3 语法是 Intel Mac 和 iPhone 所需的语法。


克里斯 - 感谢您的评论,但有很多原因可以避免将代码库移植到不同平台的标准 assert() 函数。如果您在滚动自己的断言时遇到了麻烦,通常是因为您希望保留其他功能(日志记录、堆栈展开、用户交互)。

您尝试通过“__assert”或类似的实现来替换处理程序的建议是不可移植的。标准的“断言”通常是一个宏,虽然它可能映射到 Mac 上的 __assert,但在其他平台上却没有.

4

7 回答 7

24

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.
于 2008-09-01T00:22:27.223 回答
11

您可以只插入一个调用Debugger()- 这将在调试器中停止您的应用程序(如果它正在调试器下运行),或者如果不是,则以异常停止它。

此外,不要assert()因为“可移植性原因”而避免——可移植性就是它存在的原因!它是标准 C 的一部分,您可以在任何找到 C 编译器的地方找到它。您真正想要做的是定义一个新的断言处理程序,它执行调试器中断而不是调用abort(); 几乎所有 C 编译器都提供了一种机制,您可以通过它来执行此操作。

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

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

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

于 2008-09-01T22:28:13.997 回答
6
__builtin_trap();

由于 Debugger() 现在已贬值,这应该可以代替。

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

于 2012-09-07T16:16:06.890 回答
3

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

于 2011-04-27T07:45:30.300 回答
2

我在Apple 论坛中发现了以下内容:

Xcode 没有内置任何符号中断 - 但它们可以快速添加。转到断点窗口并添加:

-[NSException 引发]

于 2008-09-01T00:22:03.340 回答
2
kill(getpid(), SIGINT);

在模拟器和设备中工作。

于 2011-06-01T17:54:37.453 回答
1

还有以下功能可用作跨平台直接 Halt() 替代方案:

#include <stdlib.h>

void abort(void);

我们在 iPhone 实现的跨平台引擎中使用它,以防出现致命断言。跨平台跨 Nintendo DS/Wii/XBOX 360/iOS 等...

于 2009-04-06T06:29:48.507 回答