我试图将相当于asm{int 3}(或类似)的东西放入我的iPhone程序中.我的目标是让Xcode完全停在有问题的线上,而不必调整调用堆栈(所以_Debugger听起来不像它会做的那样,而不是我无论如何都能找到它的框架......)然后离开我能够恢复执行(这就是我不满意的原因assert).
(我已经习惯了其他系统上的这些行为,我想在iOS上重现它们.)
到目前为止,我最好的尝试是:
asm volatile("bkpt 1");
Run Code Online (Sandbox Code Playgroud)
这会阻止相关行上的Xcode,但是当我尝试继续使用Cmd + Alt + P时,Xcode似乎BKPT再次运行.如果我使用Shift + Cmd + O,我只是得到这个:
Watchdog has expired. Remote device was disconnected? Debugging session terminated.
Run Code Online (Sandbox Code Playgroud)
(不用说,远程设备IS仍然连接.)
我没有大量的iOS,Mac,ARM,gdb或gcc的经验asm.所以我已经难过了.有没有办法让iOS和Xcode做我想做的事情?
(我不知道它是否有所作为,但根据指令大小判断我的程序是ARM代码.)
我正在尝试实现自定义资产宏(类似于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.任何帮助表示赞赏!
我正在寻找相当于
__asm__ int 3Run Code Online (Sandbox Code Playgroud)用于在物理设备上调试时的ARM/iOS处理器.是BKPT吗?我想做的就是暂停处理器,这样我就可以在那一步过去或继续执行,就像我可以使用int 3一样.