Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 我可以引起Xcode';调试程序是否以编程方式中断?_Ios_Xcode_Swift_Debugging - Fatal编程技术网

Ios 我可以引起Xcode';调试程序是否以编程方式中断?

Ios 我可以引起Xcode';调试程序是否以编程方式中断?,ios,xcode,swift,debugging,Ios,Xcode,Swift,Debugging,如果我的iOS程序正在调试器中运行,我正在寻找一种方法,使XCode调试器以编程方式从Swift代码中断。这类似于System.Diagnostics.Debugger.Break()在Visual Studio环境中的工作方式。这可能吗?这一点对于任何碰到特定代码段的开发人员来说都是很重要的,但不会出现导致代码执行永久停止的致命错误 编辑:这与要求“启用”断点的用户略有不同(尽管该问题中提供的答案正是我想要的)。我还在寻找一些可以在Swift中完成的东西,而不需要互操作、桥接头等等。我不是10

如果我的iOS程序正在调试器中运行,我正在寻找一种方法,使XCode调试器以编程方式从Swift代码中断。这类似于System.Diagnostics.Debugger.Break()在Visual Studio环境中的工作方式。这可能吗?这一点对于任何碰到特定代码段的开发人员来说都是很重要的,但不会出现导致代码执行永久停止的致命错误


编辑:这与要求“启用”断点的用户略有不同(尽管该问题中提供的答案正是我想要的)。我还在寻找一些可以在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在发出信号之前打印一些东西很重要。因为很长一段时间后,很难找出是什么导致了这个信号。顺便说一句,调试器并不总是找到信号应该来自其他进程的位置。打印
#文件名
#行
会很有帮助。