And*_*ant 21 macos xcode debugbreak
什么是导致Xcode难以破解的指令?例如,在Visual Studio下,我可以执行'_asm int 3'或'DebugBreak()'.在一些GCC实现下,它是asm("break 0")或asm("trap").
我在Xcode下尝试了各种组合而没有任何运气.(内联汇编程序工作正常,因此它不是语法问题).
作为参考,这是针对断言宏.我不想在assert.h中使用定义既可移植性,也因为它们似乎在XCode提供的版本中执行了abort().
约翰 - 超级,欢呼.作为参考,int 3语法是Intel Macs和iPhone所需的语法.
Chris - 感谢您的评论,但有很多理由要避免将标准的assert()函数移植到移植到不同平台的代码库.如果您已经解决了滚动自己断言的麻烦,通常是因为您希望保留其他功能(日志记录,堆栈展开,用户交互).
你试图通过'__sert'或类似的实现替换hander的建议不是可移植的.标准'assert'通常是一个宏,虽然它可能映射到Mac上的__assert,但它不在其他平台上.
Joh*_*kin 22
asm {trap} ; Halts a program running on PPC32 or PPC64.
__asm {int 3} ; Halts a program running on IA-32.
Run Code Online (Sandbox Code Playgroud)
Chr*_*son 10
您只需插入一个调用Debugger()- 它将在调试器中停止您的应用程序(如果它在调试器下运行),或者如果不是则将异常停止.
另外,不要assert()因为"便携性原因" 而避免 - 便携性就是它存在的原因!它是标准C的一部分,无论您在哪里找到C编译器,都可以找到它.你真正想要做的是定义一个新的断言处理程序,它执行调试器中断而不是调用abort(); 几乎所有C编译器都提供了一种机制,您可以通过它实现此目的.
通常,这是通过简单地实现遵循此原型的函数或宏来完成的:
void __assert(const char *expression, const char *file, int line);
Run Code Online (Sandbox Code Playgroud)
当断言表达式失败时调用它.通常,它assert()本身并不是执行" printf()跟随abort()",即默认记录的行为.通过自定义此功能或宏,您可以更改其行为.
| 归档时间: |
|
| 查看次数: |
15084 次 |
| 最近记录: |