黑松露是什么| 油腔滑调指什么生肖| 射进去什么感觉| omega是什么牌子的手表| 发烧为什么不能吃鸡蛋| 孩子说话晚是什么原因| left什么意思| 三叶香是什么菜| 剁椒鱼头是什么菜系| 咩是什么意思| 牙碜是什么意思| 肝的主要功能是什么| 传染病八项包括什么| 脚转筋是什么原因引起的| 荷叶配什么减肥效果好| 胸部dr是什么| 什么因果才会有双胞胎| 为什么会黄体功能不足| 广东广西以什么为界| 拔了尿管尿不出来有什么好办法| 润喉咙什么东西最合适| 金字旁加各念什么| 午时左眼跳是什么兆头| 小腿灼热感是什么原因| 什么条什么理| 营养心脏最好的药是什么药| 门庭冷落是什么意思| 姿态是什么意思| 什么药化痰效果最好| 腋下有疙瘩是什么原因| 天丝是什么材质| 腹水是什么症状| 维生素c对身体有什么好处| 早餐吃什么最减肥瘦身| 慈禧为什么要毒死光绪| ipv是什么疫苗| 回奶吃什么药| afi是胎儿的什么意思| 社康是什么| 为什么近视不可逆| 莫名是什么意思| babyface是什么意思| 喝什么解酒最快最有效| 多多关照是什么意思| 香干炒什么菜好吃| 胃疼喝什么粥| 男狗配什么属相最好| 细菌性阴道病用什么药| dha有什么作用与功效| 吃完就拉是什么原因| 牙齿痛挂什么科| 1037年属什么生肖| 宫保鸡丁属于什么菜系| 女生的下面长什么样| 肝囊性灶是什么意思| 做包皮手术挂什么科| 平行宇宙是什么意思| 褙子是什么| 干什么呢| 血管狭窄吃什么药| 学痞是什么意思| flag是什么意思| 北字五行属什么| 鲜黄花菜含有什么毒素| 葡萄糖升高说明什么| 吃什么长头发又密又多| 藤椒是什么| 欢乐海岸有什么好玩的| 牙龈为什么会肿痛| 什么的山| 感光度是什么意思| 什么是阳光抑郁症| 心脑血管供血不足吃什么药| 96100是什么电话| 白发用什么染发最安全| 腿抽筋挂什么科| 什么是理想| 孕期腰疼是什么原因| 血糖高的人能吃什么水果| 皮肤溃烂用什么药治愈最快| 喉咙痒咳嗽有痰是什么原因| roi是什么| 结局he是什么意思| 为什么会甲减| 什么年龄割双眼皮最好| 肚子咕噜咕噜响是什么原因| 碟鱼头是什么鱼| 种植牙有什么危害| 菠菜是什么季节的菜| 做好自己是什么意思| 步履匆匆的意思是什么| 父母都是a型血孩子是什么血型| 阿莫西林是治什么的| 隔离霜和bb霜有什么区别| 什么是白色家电| cot是什么| 恒顺众生是什么意思| 为什么要割包皮| 稼字五行属什么| 北极熊代表什么生肖| 药流后吃什么消炎药比较好| 眼皮跳什么预兆| 五月十八什么星座| 蚂蚁喜欢什么环境| 舌头溃疡是什么原因造成的| 汗疱疹吃什么药| 甜杆和甘蔗有什么区别| columbia是什么牌子| 三花五罗都是什么鱼| 二月一日是什么星座| 老人高烧不退是什么原因| 黄体不足吃什么补最快| 十万为什么| 过房是什么意思| 1998年属虎的是什么命| 发痧是什么原因造成的| 丑时是什么时间| 龙是什么意思| 血小板是什么| 香港身份证有什么好处| 牙体牙髓科看什么| 龙骨是什么骨头| 下嘴唇溃疡是什么原因| 蒲公英有什么作用和功效| 什么时候| 胎头位于耻上是什么意思| 什么是食品安全| vlone是什么牌子| 西安吃什么| 乳腺增生是什么| 鸣是什么家禽| 吃红薯有什么好处| 吃什么排出全身毒素| 对辣椒过敏有什么症状| 阑尾为什么会发炎| 三本是什么| 信手拈来是什么意思| 足外翻挂什么科| 动物奶油是什么做的| 出汗太多吃什么药好| 什么是胎记| 经期吃什么好| 膝盖发热是什么原因| 总胆汁酸高是什么原因| 肝癌是什么原因引起的| 急性腹泻拉水吃什么药| 乙肝表面抗原大于250是什么意思| 青少年额头长痘痘是什么原因| 古代四大发明是什么| 甲减长期服用优甲乐有什么危害| 经常自言自语是什么原因| 婴儿湿疹不能吃什么| 梦见掉了两颗牙齿是什么意思| 不割包皮有什么影响| 资金盘是什么意思| 抑郁到什么程度要吃氟西汀| 皮肤发烫是什么原因| 白色念珠菌是什么病| 猴配什么生肖最好| 性张力什么意思| 深柜是什么意思| 相形见拙什么意思| 戒指戴在食指什么意思| 梦魇是什么意思| 手麻什么原因| 双星座是什么意思| 梦见走错路是什么意思| 心脏不好最忌讳吃什么| 乳腺钼靶是什么| 经常生病是什么原因| 双十一是什么节日| 赤小豆和红豆有什么区别| 请教意思是什么| 早早孕什么时候测最准| 牡丹什么时候开放| 神经官能症有什么症状表现| 9月17号是什么星座的| 女性喝红茶有什么好处| 补血吃什么| 桃胶是什么| 什么叫窝沟封闭| 四是什么生肖| 陶渊明世称什么| 葛根粉有什么作用| 主意正是什么意思| 梦见放烟花是什么征兆| 睡觉脚麻是什么原因| 牙刷属于什么垃圾| 气管憩室是什么意思| 攀缘是什么意思| 为什么乳头会变硬| 痛什么什么痛| 汗疱疹涂什么药膏| 儿童吃手指是什么原因| 什么症状需要做肠镜| hco3-是什么意思| 吃什么助于睡眠| 萎缩性胃炎是什么症状| 睡眠不好吃什么药| 酒量越来越差什么原因| 小儿便秘吃什么药| 肾阴虚的症状吃什么药| 左肾结晶是什么意思| mac代表什么| 夜晚咳嗽是什么原因| 势均力敌是什么意思| 病字是什么结构| 晚上睡觉盗汗是什么原因| 铁观音属于什么茶类| 左眼跳是什么意思| 牛仔裤配什么上衣| 月痨病是什么病| 脸上痒是什么原因| 一什么金光| 鼠标cpi是什么意思| 独什么心什么| 打破伤风挂什么科| 精神伴侣是什么意思| 孩子感冒咳嗽吃什么药| 神经性皮炎是什么原因引起的| 7月生日是什么星座| 九夫痣是什么意思| 阴虚吃什么食物| 吃完饭恶心是什么原因| 买手是什么意思| 宝宝什么时候断奶最好| 拜读是什么意思| chocker是什么意思| 前列腺增生有什么危害| 蜕膜是什么| 71年的猪是什么命| 两个月小猫吃什么食物| 碳酸钠俗称什么| 怀孕吃什么水果好| 澳门车牌号是什么样子| 什么药可以降肌酐| 慈是什么意思| 父亲节出什么生肖| 靓女是什么意思| 拍肺片挂什么科| beginning什么意思| 戴朱砂有什么好处| 牛肉什么馅的饺子好吃| 本是什么生肖| 10个月的宝宝吃什么辅食最好| 蜜蜂飞进家里预示什么| 一穷二白什么意思| society是什么意思| 樱花是什么样子的| 老年人脸肿是什么原因引起的| 孕妇喝咖啡有什么危害| 结婚10周年是什么婚| 重生什么意思| 什么是工作日| 项羽的马叫什么名字| 小孩积食吃什么药| 蓝什么什么| 冒菜和麻辣烫有什么区别| 孕妇感冒可以吃什么感冒药| 牛是什么意思| 胃主什么| 什么食物去湿气效果好| 万宝龙属于什么档次| 解酒的酶是什么酶| 百度
blob: 334b2ae204d17add5a300641894b018c22b3cf37 [file] [log] [blame]
# Copyright 2025 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""
Provides visualizers for common types for debugging in LLDB.
To make these available, add the following to your ~/.lldbinit or your
.vscode/launch.json, or run after launching lldb:
command script import {Path to SRC Root}/tools/lldb/chromium_visualizers.py
"""
import traceback
import lldb
def lazy_unsigned_global(name, child=None):
sb_value = None
uint_value = 0
def getter(fromValue):
nonlocal sb_value
nonlocal uint_value
if sb_value is None:
sb_value = fromValue.GetTarget().FindFirstGlobalVariable(name)
if child:
sb_value = sb_value.GetChildMemberWithName(child)
uint_value = sb_value.GetValueAsUnsigned()
return uint_value
return getter
kPointerCompressionShift_getter = lazy_unsigned_global(
'cppgc::internal::api_constants::kPointerCompressionShift')
CageBaseGlobal_getter = lazy_unsigned_global(
'cppgc::internal::CageBaseGlobal::g_base_', 'base')
PLACEHOLDER_VALUE = None
class SingleChildProvider:
"""A base class for providers that create one child."""
def __init__(self, valobj):
self.child = None
self.valobj = valobj
def update(self):
# By default, reevaluate
self.child = None
def ensure_populated(self):
if self.child is None:
try:
self.populate()
except:
print(traceback.format_exc())
if self.child is None or not self.child.IsValid():
global PLACEHOLDER_VALUE
if PLACEHOLDER_VALUE is None:
PLACEHOLDER_VALUE = self.valobj.CreateValueFromExpression(
'<failed to load child>', 'nullptr')
self.child = PLACEHOLDER_VALUE
def populate(self):
raise NotImplementedError()
def num_children(self):
self.ensure_populated()
return 1
def has_children(self):
return True
def get_child_index(self, name):
self.ensure_populated()
return 0
def get_child_at_index(self, index):
self.ensure_populated()
return self.child
class VectorProvider(SingleChildProvider):
"""Provides children for a vector."""
def __init__(self, valobj, internal_dict):
super().__init__(valobj)
def populate(self):
lldbtype = self.valobj.GetType()
addr = self.valobj.GetValueAsAddress() if lldbtype.IsPointerType(
) else self.valobj.GetLoadAddress()
data_pointer = self.valobj.GetChildMemberWithName('buffer_')
size = self.valobj.GetChildMemberWithName('size_').GetValueAsUnsigned()
self.child = data_pointer.Cast(
data_pointer.GetType().GetPointeeType().GetArrayType(
size).GetPointerType())
class SmartPointerProvider(SingleChildProvider):
"""
A base class for providers that create one child generated by calling a
method on the object.
"""
def __init__(self,
raw_name,
valobj,
internal_dict,
child_name='$$dereference$$'):
super().__init__(valobj)
self.raw_name = raw_name
self.child_name = child_name
def update(self):
global PLACEHOLDER_VALUE
if self.child is PLACEHOLDER_VALUE:
self.child = None
def populate(self):
self.child = self.valobj.GetChildMemberWithName(self.raw_name).Cast(
self.valobj.GetType().GetTemplateArgumentType(0).GetPointerType())
class ScopedRefProvider(SmartPointerProvider):
def __init__(self, valobj, internal_dict):
super().__init__('ptr_', valobj, internal_dict)
class MemberProvider(SingleChildProvider):
def __init__(self, valobj, internal_dict):
super().__init__(valobj)
self.last_child = None
self.last_addr = None
self.raw_storage = None
self.pointer_type = None
self.compressed = None
def update(self):
global PLACEHOLDER_VALUE
if self.compressed is not None or self.child is PLACEHOLDER_VALUE:
self.child = None
def populate(self):
if self.raw_storage is None:
self.raw_storage = self.valobj.GetChildMemberWithName('raw_')
self.pointer_type = self.raw_storage.GetType().GetCanonicalType().GetName(
)
pointee_type = self.valobj.GetType().GetTemplateArgumentType(0)
if self.pointer_type == 'cppgc::internal::RawPointer':
data_pointer = self.raw_storage.GetChildMemberWithName('ptr_').Cast(
pointee_type.GetPointerType())
elif self.pointer_type == 'cppgc::internal::CompressedPointer':
# Need to reproduce the behavior of CompressedPointer::Decompress()
# because it is optimized away.
if self.compressed is None:
self.compressed = self.raw_storage.GetChildMemberWithName('value_')
compressed = self.compressed.GetValueAsUnsigned()
if self.last_child and self.last_addr == compressed:
# Last child is still valid
self.child = self.last_child
return
pointer_shift = kPointerCompressionShift_getter(self.raw_storage)
cage_base = CageBaseGlobal_getter(self.raw_storage)
sign_bit = 0x80000000
decompressed = ((
(compressed ^ sign_bit) - sign_bit) << pointer_shift) & cage_base
data_pointer = self.valobj.CreateValueFromAddress('$$dereference$$',
decompressed,
pointee_type)
self.last_addr = compressed
else:
# This seems to happen when the pointer is null. Ignore.
return
self.child = data_pointer
self.last_child = self.child
class MethodProvider(SingleChildProvider):
"""
A base class for providers that create one child generated by calling a
method on the object.
"""
def __init__(self,
method,
valobj,
internal_dict,
child_name='$$dereference$$'):
super().__init__(valobj)
self.method = method
self.child_name = child_name
self.last_child = None
self.last_addr = None
def populate(self):
lldbtype = self.valobj.GetType()
addr = self.valobj.GetValueAsAddress() if lldbtype.IsPointerType(
) else self.valobj.GetLoadAddress()
if self.last_child and self.last_addr == addr:
# Last child is still valid
self.child = self.last_child
return
self.child = self.valobj.CreateValueFromExpression(
self.child_name,
f'(({lldbtype.GetCanonicalType().GetName()} *){addr})->{self.method}')
self.last_child = self.child
self.last_addr = addr
class WTFStringProvider(MethodProvider):
def __init__(self, valobj, internal_dict):
super().__init__('Utf8(WTF::Utf8ConversionMode::kLenient)', valobj,
internal_dict, 'utf8_')
def __lldb_init_module(debugger, unused_dict):
debugger.HandleCommand(
'type synthetic add -l chromium_visualizers.ScopedRefProvider -x "^scoped_refptr<.*>$"'
)
debugger.HandleCommand(
'type synthetic add -p -r -l chromium_visualizers.MemberProvider -x "^cppgc::internal::BasicMember<.*>$"'
)
debugger.HandleCommand(
'type synthetic add -l chromium_visualizers.WTFStringProvider -x "^WTF::String$"'
)
debugger.HandleCommand(
'type synthetic add -l chromium_visualizers.VectorProvider -x "^WTF::Vector<.*>$"'
)
debugger.HandleCommand(
'type summary add --summary-string "${svar.utf8_}" WTF::String')
debugger.HandleCommand(
'type summary add --summary-string "${var.string_}" WTF::AtomicString')
debugger.HandleCommand(
'type summary add --summary-string "size = ${var.size_}" -x "^WTF::Vector<.*>$"'
)
debugger.HandleCommand(
'type summary add --summary-string "${var.raw_}" -x "^cppgc::internal::BasicMember<.*>$"'
)
衡于虑的衡什么意思 误会是什么意思 胀气是什么症状 怕得什么 挚友是什么意思
晕血是什么原因 办理公证需要什么材料 拔萝卜是什么意思 砗磲是什么 疖肿是什么原因引起的
牙周炎用什么漱口水好 pc是什么缩写 balenciaga是什么牌子 子宫低回声结节是什么意思 乳腺回声不均匀是什么意思
野趣是什么意思 小儿咳嗽吃什么药好 痔疮吃什么消炎药好得快 做什么饭简单又好吃 燕窝适合什么人吃
马六甲板材是什么木材hcv8jop0ns8r.cn uvb是什么意思hcv8jop2ns5r.cn 胆囊炎吃什么消炎药hcv8jop2ns5r.cn 肚子疼吃什么食物好hcv9jop5ns1r.cn 身家是什么意思hcv8jop6ns7r.cn
文殊菩萨保佑什么hcv8jop6ns0r.cn 什么叫甲亢hcv8jop4ns1r.cn 男人性功能不行是什么原因cj623037.com 犄角旮旯是什么意思hcv9jop2ns0r.cn 什么牌子的裤子质量好hcv8jop0ns3r.cn
喜欢放屁是什么原因hcv8jop1ns5r.cn 9点到11点是什么经络hcv8jop1ns6r.cn 标准的青色是什么颜色hcv7jop6ns7r.cn 糖代谢增高是什么意思hcv9jop5ns5r.cn 人间四月芳菲尽的尽是什么意思hcv8jop9ns6r.cn
胎盘附着于子宫前壁是什么意思hcv7jop4ns6r.cn 人的脂肪是什么颜色hcv9jop3ns6r.cn 靶向治疗是什么意思hcv8jop8ns3r.cn 村姑是什么意思hcv8jop0ns4r.cn 一什么头巾hcv9jop1ns3r.cn
百度