From 0e72d82cc2451f33474af64f90de199e25fc7130 Mon Sep 17 00:00:00 2001 From: Cameron McCormack Date: Wed, 15 Jan 2014 11:29:36 +1100 Subject: [PATCH] Bug 959445 - Add lldb summaries for nsIAtoms, nsTextNodes and nsTextFragments showing their text content. r=ehsan --- .lldbinit | 6 +++ python/lldbutils/lldbutils/__init__.py | 10 ++++- python/lldbutils/lldbutils/content.py | 16 +++++++ python/lldbutils/lldbutils/utils.py | 58 ++++++++++++++++++++++++++ 4 files changed, 88 insertions(+), 2 deletions(-) create mode 100644 python/lldbutils/lldbutils/content.py create mode 100644 python/lldbutils/lldbutils/utils.py diff --git a/.lldbinit b/.lldbinit index 8564681b0f2a..df68ee16b257 100644 --- a/.lldbinit +++ b/.lldbinit @@ -14,3 +14,9 @@ settings set target.prefer-dynamic-value run-target # than do any kind of searching, this assumes that you are running lldb from # the top level source directory. script sys.path.append('python/lldbutils'); import lldbutils; lldbutils.init() + +# Show the string value in atoms. +type summary add nsIAtom --summary-string "${var.mString}" + +# Show the value of text nodes. +type summary add nsTextNode --summary-string "${var.mText}" diff --git a/python/lldbutils/lldbutils/__init__.py b/python/lldbutils/lldbutils/__init__.py index 1552d5f0bb4b..cdb2d57fddbe 100644 --- a/python/lldbutils/lldbutils/__init__.py +++ b/python/lldbutils/lldbutils/__init__.py @@ -1,7 +1,13 @@ import lldb -__all__ = ['layout'] +__all__ = ['content', 'layout', 'utils'] def init(): for name in __all__: - __import__('lldbutils.' + name, globals(), locals(), ['init']).init(lldb.debugger) + init = None + try: + init = __import__('lldbutils.' + name, globals(), locals(), ['init']).init + except AttributeError: + pass + if init: + init(lldb.debugger) diff --git a/python/lldbutils/lldbutils/content.py b/python/lldbutils/lldbutils/content.py new file mode 100644 index 000000000000..020ba71ac4cb --- /dev/null +++ b/python/lldbutils/lldbutils/content.py @@ -0,0 +1,16 @@ +import lldb +from lldbutils import utils + +def summarize_text_fragment(valobj, internal_dict): + content_union = valobj.GetChildAtIndex(0) + state_union = valobj.GetChildAtIndex(1).GetChildMemberWithName("mState") + length = state_union.GetChildMemberWithName("mLength").GetValueAsUnsigned(0) + if state_union.GetChildMemberWithName("mIs2b").GetValueAsUnsigned(0): + field = "m2b" + else: + field = "m1b" + ptr = content_union.GetChildMemberWithName(field) + return utils.format_string(ptr, length) + +def init(debugger): + debugger.HandleCommand("type summary add nsTextFragment -F lldbutils.content.summarize_text_fragment") diff --git a/python/lldbutils/lldbutils/utils.py b/python/lldbutils/lldbutils/utils.py new file mode 100644 index 000000000000..73ee25ddff55 --- /dev/null +++ b/python/lldbutils/lldbutils/utils.py @@ -0,0 +1,58 @@ +def format_char(c): + if c == 0: + return "\\0" + elif c == 0x07: + return "\\a" + elif c == 0x08: + return "\\b" + elif c == 0x0c: + return "\\f" + elif c == 0x0a: + return "\\n" + elif c == 0x0d: + return "\\r" + elif c == 0x09: + return "\\t" + elif c == 0x0b: + return "\\v" + elif c == 0x5c: + return "\\" + elif c == 0x22: + return "\\\"" + elif c == 0x39: + return "\\'" + elif c < 0x20 or c >= 0x80 and c <= 0xff: + return "\\x%02x" % c + elif c >= 0x0100: + return "\\u%04x" % c + else: + return chr(c) + +# Take an SBValue that is either a char* or char16_t* and formats it like lldb +# would when printing it. +def format_string(lldb_value, length=100): + ptr = lldb_value.GetValueAsUnsigned(0) + char_type = lldb_value.GetType().GetPointeeType() + if char_type.GetByteSize() == 1: + s = "\"" + size = 1 + mask = 0xff + elif char_type.GetByteSize() == 2: + s = "u\"" + size = 2 + mask = 0xffff + else: + return "(cannot format string with char type %s)" % char_type.GetName() + i = 0 + terminated = False + while i < length: + c = lldb_value.CreateValueFromAddress("x", ptr + i * size, char_type).GetValueAsUnsigned(0) & mask + if c == 0: + terminated = True + break + s += format_char(c) + i = i + 1 + s += "\"" + if not terminated and i != length: + s += "..." + return s