Xcode 等效于 ' __asm int 3 / DebugBreak() / Halt?
Posted
技术标签:
【中文标题】Xcode 等效于 \' __asm int 3 / DebugBreak() / Halt?【英文标题】:Xcode equivalent of ' __asm int 3 / DebugBreak() / Halt?Xcode 等效于 ' __asm int 3 / DebugBreak() / Halt? 【发布时间】:2010-09-07 10:17:13 【问题描述】:在 Xcode 中导致硬中断的指令是什么?例如,在 Visual Studio 下,我可以执行“_asm int 3”或“DebugBreak()”。在某些 GCC 实现下,它是 asm("break 0") 或 asm("trap")。
我在 Xcode 下尝试了各种组合,但没有任何运气。 (内联汇编器工作正常,所以这不是语法问题)。
作为参考,这是一个断言宏。我不想将 assert.h 中的定义用于可移植性,并且因为它们似乎在 XCode 提供的版本中执行 abort()。
John - 超级棒,干杯。作为参考,int 3 语法是 Intel Mac 和 iPhone 所需的语法。
Chris - 感谢您的评论,但有很多原因可以避免将标准 assert() 函数用于移植到不同平台的代码库。如果您在滚动自己的断言时遇到了麻烦,通常是因为您希望保留其他功能(日志记录、堆栈展开、用户交互)。
您尝试通过“__assert”或类似的实现来替换处理程序的建议是不可移植的。标准的“断言”通常是一个宏,虽然它可能映射到 Mac 上的 __assert,但它不会在其他平台上。
【问题讨论】:
【参考方案1】: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.
【讨论】:
使用 GCC/clang ASM 语法,对于 Intel Mac 来说,这变成__asm__("int $3")
,对于 iDevices 来说(可能)变成 __asm__("trap")
。
上面的链接现在好像失效了。【参考方案2】:
您可以只插入对Debugger()
的调用——这将在调试器中停止您的应用程序(如果它正在调试器下运行),或者如果它不是在异常情况下停止它。
另外,不要因为“可移植性原因”而回避assert()
——可移植性就是它存在的原因!它是标准 C 的一部分,您可以在任何找到 C 编译器的地方找到它。您真正想要做的是定义一个新的 assertion handler 来执行调试器中断而不是调用 abort()
;几乎所有 C 编译器都提供了一种机制,您可以通过它来执行此操作。
这通常通过简单地实现遵循此原型的函数或宏来完成:
void __assert(const char *expression, const char *file, int line);
当断言表达式失败时调用它。通常它,而不是assert()
本身,是执行“printf()
后跟abort()
”的默认记录行为。通过自定义此函数或宏,您可以更改其行为。
【讨论】:
什么是一种可移植的方式在失败的线路上放入调试器? assert() 将您带入库代码... 感谢 Chris,但首先 - Debugger() 在标题中被标记为“已弃用”,没有任何替换方向,其次 - 我不知道要链接什么才能拥有它- 普通的“Cocoa”和“CoreFoundation”框架没有它 - 我在 _Debugger 上有一个缺少符号的链接错误【参考方案3】:__builtin_trap();
由于 Debugger() 现在已被贬值,这应该可以代替。
https://developer.apple.com/library/mac/technotes/tn2124/_index.html#//apple_ref/doc/uid/DTS10003391-CH1-SECCONTROLLEDCRASH
【讨论】:
__builtin_trap
使用 SIGILL
使您的程序崩溃(而不是几乎不中断它)。【参考方案4】:
为了后代:我有一些代码用于在调试器中的正确堆栈帧处生成暂停并(可选)暂停应用程序,以便您可以及时附加调试器。适用于模拟器和设备(可能还有桌面,如果你需要的话)。 http://iphone.m20.nl/wp/2010/10/xcode-iphone-debugger-halt-assertions/的详细帖子
【讨论】:
【参考方案5】:我在Apple Forum 中找到了以下内容:
Xcode 没有内置任何符号中断 - 但它们是 快速添加。转到断点窗口并添加:
-[NSException 引发]
【讨论】:
【参考方案6】:kill(getpid(), SIGINT);
在模拟器和设备中工作。
【讨论】:
首先,=raise(SIGINT)
。其次,这些有讨厌的倾向被转发到主线程,所以如果你在另一个线程上这样做,你实际上并没有在你提出它的地方停下来。【参考方案7】:
还有以下功能可用作跨平台直接 Halt() 替代方案:
#include <stdlib.h>
void abort(void);
我们在 iPhone 实现的跨平台引擎中使用它,以防出现致命断言。跨 Nintendo DS/Wii/XBOX 360/ios 等跨平台...
【讨论】:
以上是关于Xcode 等效于 ' __asm int 3 / DebugBreak() / Halt?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 VS2008 64 位版本中将 __asm jno no_oflow 替换为内部结构?
什么是 C++11 原子 API 等价于 ```__asm__ volatile("" ::: "memory")```