Ios 我可以引起Xcode';调试程序是否以编程方式中断?
如果我的iOS程序正在调试器中运行,我正在寻找一种方法,使XCode调试器以编程方式从Swift代码中断。这类似于System.Diagnostics.Debugger.Break()在Visual Studio环境中的工作方式。这可能吗?这一点对于任何碰到特定代码段的开发人员来说都是很重要的,但不会出现导致代码执行永久停止的致命错误Ios 我可以引起Xcode';调试程序是否以编程方式中断?,ios,xcode,swift,debugging,Ios,Xcode,Swift,Debugging,如果我的iOS程序正在调试器中运行,我正在寻找一种方法,使XCode调试器以编程方式从Swift代码中断。这类似于System.Diagnostics.Debugger.Break()在Visual Studio环境中的工作方式。这可能吗?这一点对于任何碰到特定代码段的开发人员来说都是很重要的,但不会出现导致代码执行永久停止的致命错误 编辑:这与要求“启用”断点的用户略有不同(尽管该问题中提供的答案正是我想要的)。我还在寻找一些可以在Swift中完成的东西,而不需要互操作、桥接头等等。我不是10
编辑:这与要求“启用”断点的用户略有不同(尽管该问题中提供的答案正是我想要的)。我还在寻找一些可以在Swift中完成的东西,而不需要互操作、桥接头等等。我不是100%肯定没有内置的,但是你可以在XCode UI中使用符号断点自己创建你想要的东西 1) 创建一个新类来表示调试器中断
@interface MYDebuggerBreak : NSObject
+(void)fireUpDebugger;
@end
@implementation MyDebuggerBreak
+(void)fireUpDebugger {
// Do Nothing
}
@end
2) 向该类上的方法添加符号断点
[MYDebuggerBreak fireUpDebugger]
这有点迂回,您还可以将断点直接放在“fireUpDebugger”行中,因为您可以控制代码。如果您想在方法调用时停止您无法控制的内容,则符号断点更为有用。如果通过xcode进行调试,将asm(“svc 0”)
放入代码中将停止正在运行的应用程序。请参阅:对于Swift,raise(SIGINT)
适合我
我有这个功能:
func fail(desc: String) {
#if DEBUG
print("assertFail:\(desc)")
raise(SIGINT)
#endif
}
有关调试宏设置,请参见此处:这与我试图完成的有点不同,因为它只影响设置断点的IDE。我希望调试此代码的每个人都必须在此时中断。是否希望他们在代码到达时开始手动调试?或者,您只是在收集堆栈跟踪,以便在发生这种情况时使用?在尝试跟踪罕见或间歇性问题时,将堆栈跟踪添加到代码中(通常是临时添加),这是一件非常有用的事情,并且您需要在发生时查看所有问题的状态。否则,我知道我总是可以将堆栈跟踪转储到控制台。在C#world中,我也用它来强调某些编程错误的发生(比如没有在标记为一次性的类上调用Dispose方法)。这可能是重复的!对于斯威夫特,我必须将其封装在Objective-C类中,并处理桥接标题的内容,但至少它是有效的。谢谢@JacobJ您可以尝试我下面的答案,以避免桥接标头内容作为提示,这在非ARM体系结构上不起作用,因为这是基于x86的iOS模拟器的ARM组装。在swift 5中,您必须使用
raise(SIGINT)
,而不是在swift 2.2中使用“asm”(“svc 0”),谢谢@hyouuu在发出信号之前打印一些东西很重要。因为很长一段时间后,很难找出是什么导致了这个信号。顺便说一句,调试器并不总是找到信号应该来自其他进程的位置。打印#文件名
和#行
会很有帮助。