【发布时间】:2018-08-25 01:12:47
【问题描述】:
我正在深入研究 LLDB 及其自定义数据格式化程序。假设我想检查以下代码:
import simd
let f2 = float2(42, 50)
print(f2.x)
我在print 行上打断,然后在调试器中打印f2 的值:
(lldb) p f2
(float2) $R3 = (_vector = Builtin.Vec2xFPIEEE32 @ 0x00007fd15a9b4520)
这里没什么用!所以我在 LLDB 中创建了我的自定义摘要字符串:
(lldb) type summary add --summary-string "x = ${var.x}, y = ${var.y}" float2
(lldb) p f2
(float2) $R2 = error: summary string parsing error
我对最后一行的错误感到困惑。根据LLDB Data Formatter页面有效。我的下一个直觉是 float2 没有名称为 x 的属性,但事实并非如此。
为什么摘要字符串会失败?
编辑:在 Jim Ingham 的帮助下,我想出了以下解决方案:
在文件simd.py:
import lldb
def GetSummary(valobj, internal_dict):
frame = valobj.GetFrame()
name = valobj.GetName()
x_value = frame.EvaluateExpression('{0}.x'.format(name))
y_value = frame.EvaluateExpression('{0}.y'.format(name))
x = x_value.GetValueAsUnsigned()
y = y_value.GetValueAsUnsigned()
return 'x = {0}, y = {1}'.format(x, y)
然后加载LLDB中的函数:
(lldb) command script import ~/simd.py
(lldb) type summary add -F simd.GetSummary float2
现在它适用于fr v f2,但不适用于p f2:
(lldb) fr v f2
(float2) f2 = x = 42, y = 50
(lldb) p f2
(float2) $R4 = x = 0, y = 0
如果我将 f2 的值更改为浮点数,它也不处理浮点数
let f2 = float2(42, 50)
(lldb) fr v f2
(float2) f2 = x = 42, y = 50
【问题讨论】:
-
您是否尝试仅使用 GetValue?这将返回 lldb 将值呈现为字符串的最大努力。它应该同时处理无符号和浮动,并且由于您只想打印结果而不是对其进行数学运算,就足够了。