A GDB pretty-printer for ICU4C UnicodeStrings
# To autoload this file into GDB, put the following line in ~/.gdbinit: | |
# | |
# python execfile("/path/to/icu_unicodestring_prettyprinter.py") | |
# | |
# You can also run that line of code in the GDB console without adding it to ~/.gdbinit. | |
from __future__ import print_function | |
from array import array | |
import re | |
class UnicodeStringPrinter: | |
"""GDB pretty printer for ICU4C UnicodeString""" | |
def __init__(self, val): | |
self.val = val | |
def to_string(self): | |
fLengthAndFlags = self.val["fUnion"]["fFields"]["fLengthAndFlags"] | |
if fLengthAndFlags >= 0: | |
# Short length | |
length = fLengthAndFlags >> 5 | |
else: | |
# Long length | |
length = self.val["fUnion"]["fFields"]["fLength"] | |
if (fLengthAndFlags & 2) != 0: | |
# Stack storage | |
if (fLengthAndFlags & 1) != 0: | |
return u"UnicodeString (BOGUS)" | |
stack = True | |
buffer = self.val["fUnion"]["fStackFields"]["fBuffer"] | |
else: | |
# Heap storage | |
stack = False | |
buffer = self.val["fUnion"]["fFields"]["fArray"] | |
content = array('B', [buffer[i] for i in range(length)]).tostring() | |
return u"UnicodeString (%d on %s): \"%s\"" % ( | |
length, | |
u"stack" if stack else u"heap", | |
content) | |
unicode_string_re = re.compile("^icu_?\d*::UnicodeString$") | |
def lookup_type(val): | |
if unicode_string_re.match(str(val.type)): | |
return UnicodeStringPrinter(val) | |
return None | |
gdb.pretty_printers.append(lookup_type) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment