绕过 exc_breakpoint 崩溃继续程序执行

问题描述 投票:0回答:1

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

swift xcode exception lldb
1个回答
0
投票

锻炼了一个小时后,我不准备让这次崩溃带走我的数据。由于崩溃使我陷入了 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。使用的命令是 thread 就像以前一样,但是这个 使用子命令 return 提前从堆栈返回的时间 框架,从而短路其执行。

执行

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

© www.soinside.com 2019 - 2024. All rights reserved.