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

3phpmpom  于 2023-11-16  发布在  Swift
关注(0)|答案(1)|浏览(150)

在测试我的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绕过这个错误并继续执行?

qojgxg4l

qojgxg4l1#

在锻炼了一个小时后,我不准备让这个崩溃把我的数据沿着带走。因为崩溃把我带到了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。当然,这意味着将can_pass()的返回值从0更改为1。可以通过LLDB完成。使用的命令是线程,就像以前一样,但是这次使用子命令return过早地从堆栈帧返回,从而缩短了它的执行。
执行thread return 1就成功了,它返回true(1)到索引超出范围的问题,然后继续执行下一行代码。

相关问题