【问题标题】:Custom data formatter in LLDBLLDB 中的自定义数据格式化程序
【发布时间】: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 将值呈现为字符串的最大努力。它应该同时处理无符号和浮动,并且由于您只想打印结果而不是对其进行数学运算,就足够了。

标签: swift lldb


【解决方案1】:

lldb 数据格式化程序的 ${var.*} 语法仅执行 ivar 查找以查找 *,它不会使用您提供的字符串运行表达式。它将有权访问 lldb 命令frame var 可以显示的对象的所有元素。

这种限制的原因是调用函数比直接访问 ivar 更昂贵,如果我们将所有 ${var.*} 规范作为函数调用运行,您很容易得到一个非常不高效的格式化程序。

如果您确实需要在格式化程序中调用函数,您可以使用格式化程序的 Python 函数风格和 SBFrame.EvaluateExpression 来运行表达式。

这里很重要,因为 x 是 float2 上的计算属性,它不是 ivar:

(lldb) fr v --raw f2
(simd.float2) f2 = {
  _value = {}
}

float2 唯一实际的 ivar 是不透明的 _value

还请注意,Xcode 10 具有用于 simd 类型的数据格式化程序,因此您会看到:

(lldb) fr v f2
(float2) f2 = (4.200000e+01, 5.000000e+01)

编写该数据格式化程序的人知道 simd 数据的实际布局,因此他们编写了一个可以通过内存访问而不是函数调用来收集值的程序,因此它仍然会非常快。对于观察者来说,这也是为什么我必须在上面的frame var 命令中添加--raw

【讨论】:

  • 非常感谢!根据您的回答,我想出了一个(不太令人满意)的解决方案。有什么改进建议吗?
猜你喜欢
  • 1970-01-01
  • 2018-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多