我尝试从终端使用LLDB来修改在模拟器中运行的代码。我可以用Objective-C来实现,但Swift的等价物什么也不做。我以前没有直接在终端中使用过lldb(只通过Xcode),所以我可能错过了一些非常基本的东西。这就是我在做的
Objective-C(works)
1.应用程序正在模拟器中运行
1.我在终端中启动LLDB,并使用以下命令附加到应用程序:process attached -name MyApp
1.我使用process interrupt
暂停执行
1.我使用po
修改代码(特别是[[[[[UIApplication sharedApplication] connectedScenes] anyObject] keyWindow] setRootViewController: [UIViewController new]]
),这导致在lldb输出中生成<UIViewController: 0x12e13fe60>
1.我使用process continue
恢复应用程序
应用程序处于预期状态(即空白屏幕)
Swift(不工作)
1.应用程序正在模拟器中运行
1.我在终端中启动LLDB,并使用以下命令附加到应用程序:process attached -name MyApp
1.我使用process interrupt
暂停执行
1.我用settings set target.language swift
切换到Swift
1.我使用po
修改代码(特别是(UIApplication.shared.connectedScenes.first as? UIWindowScene)?.keyWindow?.rootViewController = UIViewController()
),这导致不产生输出
1.我使用process continue
恢复应用程序
应用程序的状态和应用程序被中断之前是一样的(这让我很难过)。对Swift命令求值不会产生输出,甚至不会产生错误,这一事实在我看来是可疑的。这对于所有的陈述都是正确的(例如:在objc中,po @"Hiya"
输出Hiya
,而在swift中,po "Hiya"
不输出任何东西)。
任何建议将不胜感激。
2条答案
按热度按时间vaj7vani1#
po
的工作方式是(1)lldb使用您指定的任何语言计算您给出的表达式(这部分与p
命令所做的完全相同)。然后(2)o
部分指示lldb获取表达式的结果,并调用特定于语言的“对象描述”API来生成该结果的字符串摘要。在ObjC示例中,“expression”是一个方法调用,可能是setRootViewController:返回新的控制器对象,所以结果就是那个对象,默认的ObjC描述生成class & address作为它的摘要。
在第二种情况下,你写了一份作业。在Swift中赋值的结果是一个空元组,所以Swift对象描述API没有什么可打印的。这并不意味着表达式不起作用,只是它没有可打印的结果。
然而,对于一个确实产生结果的表达式,
po
应该在swift和ObjC中显示该结果的对象打印机版本。我在几个不同的Xcode版本上尝试了你的“Hiya”示例,我无法让它不工作,所以一定是你的设置中有什么特定的东西导致了问题。如果你想跟进这个问题,最好向https://feedbackassistant.apple.com或swift OSS bug reporter(https://bugs.swift.org)提交一个bug,因为有人会复制你的案例来找出为什么这对你不起作用。
jhiyze9q2#
我破解了!修复方法是设置命令行工具的版本。我通过Xcode -> Preferences -> Locations -> Command Line Tools(可能也可以使用
xcode-select
)来实现这一点。我猜问题是lldb版本和相关工具之间的不匹配🤷♂️。