Skip to content

Instantly share code, notes, and snippets.

@sffc
Last active September 22, 2024 14:19
Show Gist options
  • Save sffc/7b3826fd67cb78057a9e66f2b350a647 to your computer and use it in GitHub Desktop.
Save sffc/7b3826fd67cb78057a9e66f2b350a647 to your computer and use it in GitHub Desktop.
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)
@brmarkus
Copy link

nice!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment