【问题标题】:When I use lldb in a swift project, I can't modify the bool value当我在 swift 项目中使用 lldb 时,我无法修改 bool 值
【发布时间】:2019-04-26 14:09:09
【问题描述】:

请帮帮我,我是 Swift 新手。

 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesBegan(touches, with: event)

        var flag = false     
        print(" current->  \(flag)") /** Add a breakpoint  **/
        if flag == true {
            print(" after  -> true")
        }else {
            print(" after ->   false")
        }
    }

我想用lldb来修改'flag'的值,所以,

(lldb) po flag
false

(lldb) expression flag = true
(lldb) po flag
true

(lldb) continue
2018-11-24 23:57:05.552804+0800 test_swift_lldb[6806:384106] XPC connection interrupted
Process 6806 resuming
 current->  false
 after ->   false

好像没什么用。 请告诉我如何使用lldb,修改bool值。

【问题讨论】:

标签: swift


【解决方案1】:

首先,这似乎是 Swift 和 LLDB 之间的问题。我怀疑 Swift 正在将 var 标志优化到一个寄存器中。还有一些关于类似问题的其他 SO 问题,例如:Why is Xcode's Variables View's “Edit Value” not changing the variable value?。有趣的是,Xcode 以某种方式解决了这个问题。解决方法似乎是“欺骗” LLDB 以识别变量已更新。我修改了你的代码如下:

//
//  main.swift
//  debug_example
//

import Foundation

print("Hello, main")
var flag = false
var debugString = "abcd"
if debugString.count == 0 { flag = true }

print(" current->  \(flag)") /** Add a breakpoint  **/
if flag == true {
    print(" after  -> true")
}else {
    print(" after ->   false")
}

以下是我简化的 LLDB 命令(输出缩进):

lldb main
breakpoint set --line 8
process launch
    Process 64052 launched:
po flag
    false
ex flag=true
po flag
    true
s
    Hello, World!
    Target 0: (main) stopped.
po flag
    false
ex flag=true
po flag
    true
thread continue
    Resuming thread
    current->  true
    after  -> true

也许其他人可以提供更多信息或一些关于 Xcode 如何解决此问题的见解。

【讨论】:

  • 哇,它有效。但是,当我编码时,我不会写那些代码来“欺骗”lldb,因为这些代码对项目没有意义......
  • 我完全同意。我刚刚清理了一些旧版本的 llvm 和相关组件。我有lldb --version showing: lldb-1000.11.38.2 Swift-4.2。现在一切都如您所愿;不需要任何技巧。检查您的 swiftc 和 lldb 版本。
  • 不好意思问你,我当前的xcode配置是lldb --version 显示:lldb-1000.11.38.2 Swift-4.2。但是当我为这个问题运行我的初始代码时,它不起作用...是什么原因造成的? override func touchesBegan(_ touches: Set<uitouch>, with event: UIEvent?) { super.touchesBegan(touches, with: event) var flag = false print(" current-&gt; (flag)") /**添加断点 **/ if flag == true { print(" after -&gt; true") }else { print(" after -&gt; false") } }</uitouch>
  • 也许备份一下。创建一个非常非常简单的项目,如上面的示例代码。如果您安装了 Xcode,请从那里尝试。 Xcode 使用 lldb。接下来从命令行尝试:swiftc -g main.swift,然后是 lldb main。就像我提到的,当我删除旧版本的 lldb 时,它对我有用。
猜你喜欢
  • 2021-04-03
  • 2012-12-11
  • 2021-02-03
  • 2022-01-20
  • 1970-01-01
  • 2018-08-19
  • 2014-10-04
  • 2020-06-04
  • 2016-04-18
相关资源
最近更新 更多