diff options
author | evan@chromium.org <evan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-01-14 22:33:41 +0000 |
---|---|---|
committer | evan@chromium.org <evan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-01-14 22:33:41 +0000 |
commit | fa2bde6c38485ab4d3131a3ecdbaf8dbfc5d892a (patch) | |
tree | 8c50666fd49a545f25756603fe299249bdbf2af0 /tools/gdb | |
parent | 947fc0d47d45a01dc8608b3043254db66ae2a9da (diff) | |
download | chromium_src-fa2bde6c38485ab4d3131a3ecdbaf8dbfc5d892a.zip chromium_src-fa2bde6c38485ab4d3131a3ecdbaf8dbfc5d892a.tar.gz chromium_src-fa2bde6c38485ab4d3131a3ecdbaf8dbfc5d892a.tar.bz2 |
linux: add a gdb pretty-print module for WebCore types
Now I can see e.g. Indic scripts in my string literals while debugging.
Review URL: http://codereview.chromium.org/548019
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@36288 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'tools/gdb')
-rw-r--r-- | tools/gdb/webkit.py | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/tools/gdb/webkit.py b/tools/gdb/webkit.py new file mode 100644 index 0000000..2e1cf12 --- /dev/null +++ b/tools/gdb/webkit.py @@ -0,0 +1,96 @@ +# Copyright (c) 2010 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +"""GDB support for WebKit types. + +Add this to your gdb by amending your ~/.gdbinit as follows: + python + import sys + sys.path.insert(0, "/path/to/tools/gdb/") + import webkit +""" + +import gdb +import struct + +def ustring_to_string(ptr, length=None): + """Convert a pointer to UTF-16 data into a Python Unicode string. + + ptr and length are both gdb.Value objects. + If length is unspecified, will guess at the length.""" + extra = '' + if length is None: + # Try to guess at the length. + for i in xrange(0, 2048): + if int((ptr + i).dereference()) == 0: + length = i + break + if length is None: + length = 256 + extra = u' (no trailing NUL found)' + else: + length = int(length) + + char_vals = [int((ptr + i).dereference()) for i in xrange(length)] + string = struct.pack('H' * length, *char_vals).decode('utf-16', 'replace') + + return string + extra + + +class StringPrinter: + "Shared code between different string-printing classes" + def __init__(self, val): + self.val = val + + def display_hint(self): + return 'string' + + +class UCharStringPrinter(StringPrinter): + "Print a UChar*; we must guess at the length" + def to_string(self): + return ustring_to_string(self.val) + + +class WebCoreAtomicStringPrinter(StringPrinter): + "Print a WebCore::AtomicString" + def to_string(self): + return self.val['m_string'] + + +class WebCoreStringPrinter(StringPrinter): + "Print a WebCore::String" + def get_length(self): + if not self.val['m_impl']['m_ptr']: + return 0 + return self.val['m_impl']['m_ptr']['m_length'] + + def to_string(self): + if self.get_length() == 0: + return '(null)' + + return ustring_to_string(self.val['m_impl']['m_ptr']['m_data'], + self.get_length()) + + +def lookup_function(val): + """Function used to load pretty printers; will be passed to GDB.""" + lookup_tag = val.type.tag + printers = { + "WebCore::AtomicString": WebCoreAtomicStringPrinter, + "WebCore::String": WebCoreStringPrinter, + } + name = val.type.tag + if name in printers: + return printers[name](val) + + if val.type.code == gdb.TYPE_CODE_PTR: + name = str(val.type.target().unqualified()) + if name == 'UChar': + return UCharStringPrinter(val) + + return None + + +gdb.pretty_printers.append(lookup_function) |