我正在尝试实现自定义资产宏(类似于assert.h所具有的),但我希望能够在获得并断言之后继续执行.
例如,一个这样的ASSERT实现可以是:
#define ASSERT(expr) ((void)( (!!(expr)) || (__debugbreak(), 0)))
Run Code Online (Sandbox Code Playgroud)
__debugbreak是Microsoft编译器中的一个内部函数,它插入了软件断点,相当于_asm int 3x86.对于iOS,有不同的方法来实现__debugbreak:
__asm__("int $3"); 对于x86.__asm__("bkpt #0"); 对于常规手臂.__asm__("brk #0"); for arm64raise(SIGTRAP)但是当我的断言命中时,所有这些都不能简单地跨过并继续我在使用visual studio时可以做的事情; 当我的iOS构建中的某些东西断言它在断言时卡住了,我别无选择,只能终止,我甚至无法手动移动指令指针并跳过断言.
是否有可能在iOS上实现断言进入调试器并仍允许我继续执行的断言?
在Mac OS X和iOS模拟器(均为x86)中,我们可以使用int3内联汇编中的指令陷阱到调试器(LLDB).这很好,因为它陷阱到特定的代码行,但我们可以通过在调试器中按下continue来立即继续.
有没有办法在iOS硬件上执行此操作?
对于一个较旧的问题的回答提到了raise(SIGINT)我所能看到的(从检查中signal.h)并不存在.另一个答案提到trap汇编指令,它会导致构建错误("无法识别的指令助记符").同样无法识别的是ARM文档中提到的BKPT汇编指令.
我已经尝试__builtin_trap()了几乎,几乎做了我想要的,但不允许我继续.除非我使用jump +1或者手动推进指令指针,否则我会继续按下它register write pc `$pc+8\`,这比仅仅按下继续操作要方便得多.
我正在为使用Xcode 7.3.1的32位和64位设备构建iOS 9.任何帮助表示赞赏!
有没有办法以编程方式启用断点?通常我会使用断点条件,但我需要使用符号断点。
具体来说,contentOffset我的 UIScrollView 在调用scrollToIndexPath和调用之间发生了变化reloadData。我想仅在调用scrollToIndexPath.