summaryrefslogtreecommitdiffstats
path: root/tools/gdb
diff options
context:
space:
mode:
authorevan@chromium.org <evan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-01-14 22:33:41 +0000
committerevan@chromium.org <evan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-01-14 22:33:41 +0000
commitfa2bde6c38485ab4d3131a3ecdbaf8dbfc5d892a (patch)
tree8c50666fd49a545f25756603fe299249bdbf2af0 /tools/gdb
parent947fc0d47d45a01dc8608b3043254db66ae2a9da (diff)
downloadchromium_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.py96
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)