Xcode等效于'__asm int 3 / DebugBreak()/停止吗?

时间:2020-03-05 18:45:46  来源:igfitidea点击:

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

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

供参考,这是一个断言宏。我不想同时使用assert.h中的定义来实现可移植性,并且因为它们似乎在XCode提供的版本中使用了abort()。

John Super,加油。作为参考,int 3语法是Intel Macs和iPhone所需的一种。

克里斯(Chris)感谢评论,但是有很多原因需要避免将标准的assert()函数用于移植到不同平台的代码库。如果我们遇到了无法确定自己的断言的麻烦,那通常是因为我们希望保留其他功能(日志记录,堆栈展开,用户交互)。

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

解决方案

回答

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

回答

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.

回答

我们可以仅插入对Debugger()的调用,这将在调试器中停止应用程序(如果正在调试器中运行),或者如果没有异常则将其暂停。

另外,不要因为"可移植性原因"而避免使用assert(),这就是它存在的原因!它是Standard C的一部分,无论在哪里找到C编译器,都可以找到它。我们真正想做的是定义一个新的断言处理程序,该断言处理程序可以使调试器中断,而不是调用abort()。几乎所有的C编译器都提供了一种我们可以执行此操作的机制。

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

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

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

回答

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

#include <stdlib.h>

void abort(void);

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