【发布时间】:2017-10-02 16:32:41
【问题描述】:
尤其是print 命令通常(80-90% 的失败率)不起作用
我已经验证过: https://developer.apple.com/library/content/qa/qa1947/_index.html
示例 1
(lldb) p prevMsg
错误:无法实现:无法获取runOnce的值:从值中提取数据失败错误:DoExecute出错,无法PrepareToExecuteJITExpression
示例 2 一个更典型的示例,让您进入计算的石器时代:
(lldb) p activeNetworkRequests
错误:执行被中断,原因:EXC_BAD_ACCESS(代码=1,地址=0x1700530)。进程已经返回到表达式求值前的状态。
自 Xcode 7 以来,这似乎变得越来越糟。
在闭包的封闭函数范围内打印变量尤其无望。
代码库不小,大约15K行。在这里隔离和重现所有代码是不切实际的。
肯定其他人正在经历这种情况?
更新:有人告诉我表达式 --unwind-on-error=0 -- variable-in-question 的优点,大概是 example2
更新 2:
代码:
Util.log("Returning \(key) from file cache", [.Caches])
输出:
08:03:11.201 v2.0.64d other TwoStageCache.swift objectForKey(_:completion:)[95]: Returning https://example.server.com/Storage/Retrieve?FileName=accounts/person@domain.com/resource/47a58660-26d1-11e7-8e7f-c9f4cd679b03.html from file cache
(所以key的值没问题)
(lldb) fr var key
(URL) key = unable to read data
(lldb) print key
error: Execution was interrupted, reason: EXC_BAD_ACCESS (code=1, address=0x1d787583).
The process has been returned to the state before expression evaluation.
如果我们查看崩溃:
(lldb) expression --unwind-on-error=0 -- key
libobjc.A.dylib`objc_retain:
0x22562b0 <+0>: pushl %ebp
0x22562b1 <+1>: movl %esp, %ebp
0x22562b3 <+3>: subl $0x8, %esp
0x22562b6 <+6>: calll 0x22562bb ; <+11>
0x22562bb <+11>: popl %ecx
0x22562bc <+12>: movl 0x8(%ebp), %eax
0x22562bf <+15>: testl %eax, %eax
0x22562c1 <+17>: je 0x22562e1 ; <+49>
0x22562c3 <+19>: movl (%eax), %edx
-> 0x22562c5 <+21>: testb $0x2, 0x10(%edx)
发件人:
1 $__lldb_expr(UnsafeMutablePointer<Any>) -> ()
2 Beta Viewer`@objc AppDelegate.init() -> AppDelegate:
3 sharedEnchantment`partial apply for TwoStageCache.(objectForKey(URL, completion : (imgData : Data?, err : BBError?) -> ()) -> ()).(closure #1)
4 sharedEnchantment`thunk:
【问题讨论】:
-
使用
po [yourVariable] -
在某些情况下有效,谢天谢地(?)产生的详细输出比 p 少。我必须积累更多关于 po 与 p 的统计数据
-
在这种情况下什么是“key”?它是 ivar、局部变量、参数等吗?它的类型是什么?您可以执行“frame var -L key”来打印调试信息告诉我们的位置。显然那不是它所在的位置,这就是表达式在尝试访问它时崩溃的原因。但问题是在这种情况下,为什么我们认为它不是。如果您可以向 swift.org 提交错误,那可能是一个更好的论坛来来回调查此问题。