Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
A GDB pretty-printer for ICU4C UnicodeStrings
# To autoload this file into GDB, put the following line in ~/.gdbinit:
# python execfile("/path/to/")
# 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
# 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"]
# 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\"" % (
u"stack" if stack else u"heap",
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment