Я глубоко погружаюсь в 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
, но это совсем не так.
Почему не получается строка резюме?
Редактировать : с помощью Джима Ингэма мне удалось найти следующее решение:
В файле 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