diff options
Diffstat (limited to 'chromium/tools/gdb/gdb_chrome.py')
-rw-r--r-- | chromium/tools/gdb/gdb_chrome.py | 297 |
1 files changed, 0 insertions, 297 deletions
diff --git a/chromium/tools/gdb/gdb_chrome.py b/chromium/tools/gdb/gdb_chrome.py deleted file mode 100644 index 2c7c3717fb4..00000000000 --- a/chromium/tools/gdb/gdb_chrome.py +++ /dev/null @@ -1,297 +0,0 @@ -# Copyright (c) 2011 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 Chrome types. - -Add this to your gdb by amending your ~/.gdbinit as follows: - python - import sys - sys.path.insert(0, "/path/to/tools/gdb/") - import gdb_chrome - end - -This module relies on the WebKit gdb module already existing in -your Python path. - -Use - (gdb) p /r any_variable -to print |any_variable| without using any printers. -""" - -import datetime -import gdb -import gdb.printing -import webkit - -# When debugging this module, set the below variable to True, and then use -# (gdb) python del sys.modules['gdb_chrome'] -# (gdb) python import gdb_chrome -# to reload. -_DEBUGGING = False - - -pp_set = gdb.printing.RegexpCollectionPrettyPrinter("chromium") - - -def typed_ptr(ptr): - """Prints a pointer along with its exact type. - - By default, gdb would print just the address, which takes more - steps to interpret. - """ - # Returning this as a cast expression surrounded by parentheses - # makes it easier to cut+paste inside of gdb. - return '((%s)%s)' % (ptr.dynamic_type, ptr) - - -class Printer(object): - def __init__(self, val): - self.val = val - - -class StringPrinter(Printer): - def display_hint(self): - return 'string' - - -class String16Printer(StringPrinter): - def to_string(self): - return webkit.ustring_to_string(self.val['_M_dataplus']['_M_p']) -pp_set.add_printer( - 'string16', - '^string16|std::basic_string<(unsigned short|char16|base::char16).*>$', - String16Printer); - - -class GURLPrinter(StringPrinter): - def to_string(self): - return self.val['spec_'] -pp_set.add_printer('GURL', '^GURL$', GURLPrinter) - - -class FilePathPrinter(StringPrinter): - def to_string(self): - return self.val['path_']['_M_dataplus']['_M_p'] -pp_set.add_printer('FilePath', '^FilePath$', FilePathPrinter) - - -class SizePrinter(Printer): - def to_string(self): - return '%sx%s' % (self.val['width_'], self.val['height_']) -pp_set.add_printer('gfx::Size', '^gfx::(Size|SizeF|SizeBase<.*>)$', SizePrinter) - - -class PointPrinter(Printer): - def to_string(self): - return '%s,%s' % (self.val['x_'], self.val['y_']) -pp_set.add_printer('gfx::Point', '^gfx::(Point|PointF|PointBase<.*>)$', - PointPrinter) - - -class RectPrinter(Printer): - def to_string(self): - return '%s %s' % (self.val['origin_'], self.val['size_']) -pp_set.add_printer('gfx::Rect', '^gfx::(Rect|RectF|RectBase<.*>)$', - RectPrinter) - - -class SmartPtrPrinter(Printer): - def to_string(self): - return '%s%s' % (self.typename, typed_ptr(self.ptr())) - - -class ScopedRefPtrPrinter(SmartPtrPrinter): - typename = 'scoped_refptr' - def ptr(self): - return self.val['ptr_'] -pp_set.add_printer('scoped_refptr', '^scoped_refptr<.*>$', ScopedRefPtrPrinter) - - -class LinkedPtrPrinter(SmartPtrPrinter): - typename = 'linked_ptr' - def ptr(self): - return self.val['value_'] -pp_set.add_printer('linked_ptr', '^linked_ptr<.*>$', LinkedPtrPrinter) - - -class WeakPtrPrinter(SmartPtrPrinter): - typename = 'base::WeakPtr' - def ptr(self): - flag = ScopedRefPtrPrinter(self.val['ref_']['flag_']).ptr() - if flag and flag['is_valid_']: - return self.val['ptr_'] - return gdb.Value(0).cast(self.val['ptr_'].type) -pp_set.add_printer('base::WeakPtr', '^base::WeakPtr<.*>$', WeakPtrPrinter) - - -class CallbackPrinter(Printer): - """Callbacks provide no usable information so reduce the space they take.""" - def to_string(self): - return '...' -pp_set.add_printer('base::Callback', '^base::Callback<.*>$', CallbackPrinter) - - -class LocationPrinter(Printer): - def to_string(self): - return '%s()@%s:%s' % (self.val['function_name_'].string(), - self.val['file_name_'].string(), - self.val['line_number_']) -pp_set.add_printer('tracked_objects::Location', '^tracked_objects::Location$', - LocationPrinter) - - -class LockPrinter(Printer): - def to_string(self): - try: - if self.val['owned_by_thread_']: - return 'Locked by thread %s' % self.val['owning_thread_id_'] - else: - return 'Unlocked' - except gdb.error: - return 'Unknown state' -pp_set.add_printer('base::Lock', '^base::Lock$', LockPrinter) - - -class TimeDeltaPrinter(object): - def __init__(self, val): - self._timedelta = datetime.timedelta(microseconds=int(val['delta_'])) - - def timedelta(self): - return self._timedelta - - def to_string(self): - return str(self._timedelta) -pp_set.add_printer('base::TimeDelta', '^base::TimeDelta$', TimeDeltaPrinter) - - -class TimeTicksPrinter(TimeDeltaPrinter): - def __init__(self, val): - self._timedelta = datetime.timedelta(microseconds=int(val['ticks_'])) -pp_set.add_printer('base::TimeTicks', '^base::TimeTicks$', TimeTicksPrinter) - - -class TimePrinter(object): - def __init__(self, val): - timet_offset = gdb.parse_and_eval( - 'base::Time::kTimeTToMicrosecondsOffset') - self._datetime = (datetime.datetime.fromtimestamp(0) + - datetime.timedelta(microseconds= - int(val['us_'] - timet_offset))) - - def datetime(self): - return self._datetime - - def to_string(self): - return str(self._datetime) -pp_set.add_printer('base::Time', '^base::Time$', TimePrinter) - - -class IpcMessagePrinter(Printer): - def header(self): - return self.val['header_'].cast( - gdb.lookup_type('IPC::Message::Header').pointer()) - - def to_string(self): - message_type = self.header()['type'] - return '%s of kind %s line %s' % ( - self.val.dynamic_type, - (message_type >> 16).cast(gdb.lookup_type('IPCMessageStart')), - message_type & 0xffff) - - def children(self): - yield ('header_', self.header().dereference()) - yield ('capacity_', self.val['capacity_']) - yield ('variable_buffer_offset_', self.val['variable_buffer_offset_']) - for field in self.val.type.fields(): - if field.is_base_class: - continue - yield (field.name, self.val[field.name]) -pp_set.add_printer('IPC::Message', '^IPC::Message$', IpcMessagePrinter) - - -class NotificationRegistrarPrinter(Printer): - def to_string(self): - try: - registrations = self.val['registered_'] - vector_finish = registrations['_M_impl']['_M_finish'] - vector_start = registrations['_M_impl']['_M_start'] - if vector_start == vector_finish: - return 'Not watching notifications' - if vector_start.dereference().type.sizeof == 0: - # Incomplete type: b/8242773 - return 'Watching some notifications' - return ('Watching %s notifications; ' - 'print %s->registered_ for details') % ( - int(vector_finish - vector_start), - typed_ptr(self.val.address)) - except gdb.error: - return 'NotificationRegistrar' -pp_set.add_printer('content::NotificationRegistrar', - '^content::NotificationRegistrar$', - NotificationRegistrarPrinter) - - -class SiteInstanceImplPrinter(object): - def __init__(self, val): - self.val = val.cast(val.dynamic_type) - - def to_string(self): - return 'SiteInstanceImpl@%s for %s' % ( - self.val.address, self.val['site_']) - - def children(self): - yield ('id_', self.val['id_']) - yield ('has_site_', self.val['has_site_']) - if self.val['browsing_instance_']['ptr_']: - yield ('browsing_instance_', self.val['browsing_instance_']['ptr_']) - if self.val['process_']: - yield ('process_', typed_ptr(self.val['process_'])) - if self.val['render_process_host_factory_']: - yield ('render_process_host_factory_', - self.val['render_process_host_factory_']) -pp_set.add_printer('content::SiteInstanceImpl', '^content::SiteInstanceImpl$', - SiteInstanceImplPrinter) - - -class RenderProcessHostImplPrinter(object): - def __init__(self, val): - self.val = val.cast(val.dynamic_type) - - def to_string(self): - pid = '' - try: - child_process_launcher_ptr = ( - self.val['child_process_launcher_']['impl_']['data_']['ptr']) - if child_process_launcher_ptr: - context = (child_process_launcher_ptr['context_']['ptr_']) - if context: - pid = ' PID %s' % str(context['process_']['process_']) - except gdb.error: - # The definition of the Context type may not be available. - # b/8242773 - pass - return 'RenderProcessHostImpl@%s%s' % (self.val.address, pid) - - def children(self): - yield ('id_', self.val['id_']) - yield ('render_widget_hosts_', - self.val['render_widget_hosts_']['data_']) - yield ('fast_shutdown_started_', self.val['fast_shutdown_started_']) - yield ('deleting_soon_', self.val['deleting_soon_']) - yield ('pending_views_', self.val['pending_views_']) - yield ('visible_widgets_', self.val['visible_widgets_']) - yield ('backgrounded_', self.val['backgrounded_']) - yield ('widget_helper_', self.val['widget_helper_']) - yield ('is_initialized_', self.val['is_initialized_']) - yield ('browser_context_', typed_ptr(self.val['browser_context_'])) - yield ('sudden_termination_allowed_', - self.val['sudden_termination_allowed_']) - yield ('ignore_input_events_', self.val['ignore_input_events_']) - yield ('is_guest_', self.val['is_guest_']) -pp_set.add_printer('content::RenderProcessHostImpl', - '^content::RenderProcessHostImpl$', - RenderProcessHostImplPrinter) - - -gdb.printing.register_pretty_printer(gdb, pp_set, replace=_DEBUGGING) |