2008-09-01 60 views
17

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

我试过Xcode下的各种组合,没有任何运气。 (内联汇编工作正常,所以它不是一个语法问题)。

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


约翰 - 超级,欢呼声。作为参考,INT 3语法是英特尔Mac和iPhone所需的语法。


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

您尝试通过的实现更换投手的建议“__assert”或类似的不会是便携的,标准的‘断言’通常是一个宏,虽然它可以映射到__assert没有关系的Mac上” :T在其他平台上

回答

18

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. 
+6

随着GCC /铛ASM语法,这成为'__asm __( “INT $ 3”)`英特尔Macs和(可能)`__asm __( “陷阱”)`进行的iDevices。 – zneak 2012-10-28 22:01:50

+1

上面的链接现在似乎已经死了。 – rstackhouse 2015-01-21 17:35:56

2

我发现在Apple Forum如下:

Xcode中没有附带内置的任何象征性的突破 - 但他们 快速补充转到断点窗口add:

- [N SException加薪]

10

您可以直接插入到Debugger()通话 - 将在调试器停止你的应用程序(如果它正在调试器下运行),或与异常停止它如果不是。

此外,为“便携性的原因”不避免assert() - 便携性是它存在的原因!它是标准C的一部分,无论您在哪里找到C编译器,都可以找到它。你真正想要做的是定义一个新的断言处理程序,它执行调试程序中断,而不是调用abort();几乎所有的C编译器都提供了一个可以做到这一点的机制。

通常,这是通过简单地执行下面这个原型的函数或宏来完成:

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

当断言表达失败这就是所谓的。通常它不是assert()本身,它执行的是“printf()后跟abort()”,这是默认的记录行为。通过自定义此功能或宏,您可以更改其行为。

+2

在故障线路上放入调试器的便携方式是什么? assert()将你放入库代码中... – JBRWilkinson 2011-10-05 17:41:44

+1

感谢Chris,但是第一个 - Debugger()在头文件中被标记为“已弃用”,没有任何替代方向,第二 - 我不知道要连接什么,在为了获得它 - 正常的“可可”和“CoreFoundation”框架没有它 - 我有一个链接错误_Debugger – 2016-01-14 08:29:38

1

还有以下功能是作为跨平台的直线停止()的替代:

#include <stdlib.h> 

void abort(void); 

我们的致命断言情况下使用它在我们的跨平台引擎的iPhone实现。跨越任天堂DS/Wii/XBOX 360/iOS等的跨平台...

2
kill(getpid(), SIGINT); 

在模拟器和设备中工作。