绕过exc_breakpoint崩溃以继续执行程序



在测试我的iOS应用程序(这是一个锻炼应用程序(时,该应用程序在试图保存锻炼数据时崩溃(EXC_BREAKPOINT(。

崩溃是一个指数超出范围的问题,数组计数比训练秒数少1。(我应该从1而不是0开始秒计数器(

for i in 0...seconds {
let data = "(i),(dataArray.powerGenY[i-1]),(dataArray.powerGenYAlt[i-1])n"

do {
try data.appendToURL(fileURL: fileURL)
}
catch {
print("Could not write data to file")
}
}

不管怎样,这个错误把我送到了LLDB。有什么方法可以绕过这个错误并继续执行吗?

锻炼了一个小时后,我不准备让这次崩溃带走我的数据。由于崩溃使我进入LLDB,我想看看是否有任何方法可以通过跳过/绕过/更改i的值来挽救数据,以便程序可以继续执行。

最初我尝试了

(lldb) po i = 3327
error: <EXPR>:3:1: error: cannot assign to value: 'i' is immutable
i = 3327
^

但它不允许我更改值(I is immutable(

然后我尝试了thread jump -l 1,但它抛出了一些错误,说不是在当前函数之外执行代码。

(lldb) th j -l 29
error: CSVExport.swift:29 is outside the current function.

最后,通过这个网站https://www.inovex.de/blog/lldb-patch-your-code-with-breakpoints/尝试一些事情。帮助的是线程跳转

线程返回

可以通过使用改变控制流行为的不同技术。而不是直接操作受影响的代码行操作程序的其他部分,从而导致期望的行为。对于给定的示例,这意味着更改can_pass((的返回值从0到1。当然,这是可以做到的通过LLDB。要使用的命令和以前一样是线程,但是使用子命令return从堆栈提前返回的时间帧,从而缩短其执行。

执行thread return 1成功了。这对索引超出范围的问题返回true(1(,然后继续执行到下一行代码。

最新更新