我将应用程序设置为将调试输出发送到控制台或日志文件.现在,我想在代码中决定是否
有没有办法确定应用程序是否在调试器中运行?
对于我的iPhone项目中的断言宏,我正在寻找一种以编程方式进入调试器的方法.在Windows(MSVC++)上,我可以使用__debugbreak()来实现此目的.调用此函数将停止我的程序,启动调试器,并显示调用__debugbreak()的行的调用堆栈.
iPhone的__debugbreak()有什么类似的东西吗?我已经尝试过Debugger(),但这给了我一个链接器错误.
谢谢,克劳斯
我试图将相当于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代码.)
在我自己开发的断言宏中,我一直在iOS设备上使用asm("陷阱")(或在iOS模拟器上使用asm("int3")来打破调试器.但是,在64位版本的设备中,我得到了陷阱指令的"无法识别的指令助记符".arm64有同等效力吗?
(像__builtin_trap()或raise(SIGINT)这样的替代品可以工作,但有一些我不喜欢的行为;前者不会让你继续经过休息,而后者是一个功能所以你总是在下面一步当你休息时你需要在堆栈中.)