Files
sdk/runtime/tools/gdb-macros
T
dgrove@google.com 4c0f559d23 Initial checkin.
git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@15 260f80e4-7a28-3924-810f-c04153c831b5
2011-10-05 05:20:07 +00:00

625 lines
16 KiB
Plaintext

# Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.
#
# Set of GDB macros that aid in debugging dart internal data structures
# in a non intrusive manner (no need to execute code and hence can be
# used in a corefile or after a crash when debugging inside gdb).
#
# include this file into your gdb session using "source tools/gdb-macros"
# The command "help user-defined" dumps all the extended commands available
# for debugging the dart VM once this file is included.
#
#
# ==============
# Generic macros
# ==============
#
define bi
set $SHOW_CONTEXT = 1
break * $arg0
end
document bi
Set a breakpoint on address
Usage: bi addr
end
# Enable break points.
define be
enable $arg0
end
document be
Enable breakpoint #
Usage: be num
end
# Disable break points.
define bd
disable $arg0
end
document bd
Disable breakpoint #
Usage: bd num
end
# Print frame information.
define stack
info frame
info stack
info args
info locals
end
document stack
Print stack details
end
#
# ====================================
# Object type and contents dump macros
# ====================================
#
define printrawtype
if $argc == 1
set $raw_object = (uword)$arg0
if ($raw_object & dart::kSmiTagMask) == dart::kHeapObjectTag
set $raw_object = $raw_object - dart::kHeapObjectTag
set $raw_class = (uword)(((dart::RawObject*)$raw_object)->class_) - dart::kHeapObjectTag
set $type = ((dart::RawClass*)$raw_class)->instance_kind_
print $type
else
printf "dart::kSmi\n"
end
else
printf "Usage: printrawtype <address of rawobject>\n"
end
end
document printrawtype
Print the type of specified raw object
end
define printtype
if $argc == 1
set $handle = $arg0
printrawtype $handle.raw_
else
printf "Usage: printtype <handle reference>\n"
end
end
document printtype
Print the type of object pointed to by the handle
end
define printname
if $argc == 1
# TODO(asiva): Need to deal with generic strings.
set $raw_onebytestring = (dart::RawOneByteString*)((uword)$arg0 - dart::kHeapObjectTag)
set $length = (uword)($raw_onebytestring->length_) >> dart::kSmiTagMask
set $offset = sizeof(dart::RawOneByteString)
while $length > 0
printf "%c", *((char*)((uword)$raw_onebytestring + $offset))
set $offset = $offset + 1
set $length = $length - 1
end
printf "\n"
else
printf "Null\n"
end
end
define printfunctions
if $argc == 1
set $raw_array = (dart::RawArray*)((uword)$arg0 - dart::kHeapObjectTag)
set $index = 0
while $index < (uword)$raw_array->length_ >> dart::kSmiTagMask
set $temp = *(dart::RawObject*)((uword)$raw_array + \
sizeof(dart::RawArray) + \
($index * sizeof(dart::RawObject*)))
set $temp = (uword)$temp - dart::kHeapObjectTag
printrawfunction $temp
set $index = $index + 1
end
else
printf "Null\n"
end
end
define printfields
if $argc == 1
set $raw_array = (dart::RawArray*)((uword)$arg0 - dart::kHeapObjectTag)
set $index = 0
while $index < (uword)$raw_array->length_ >> dart::kSmiTagMask
set $temp = *(dart::RawObject*)((uword)$raw_array + \
sizeof(dart::RawArray) + \
($index * sizeof(dart::RawObject*)))
set $temp = (uword)$temp - dart::kHeapObjectTag
printrawfield $temp
set $index = $index + 1
end
else
printf "Null\n"
end
end
define printinterfaces
if $argc == 1
set $raw_array = (dart::RawArray*)((uword)$arg0 - dart::kHeapObjectTag)
set $index = 0
while $index < (uword)$raw_array->length_ >> dart::kSmiTagMask
set $temp = *(dart::RawObject*)((uword)$raw_array + \
sizeof(dart::RawArray) + \
($index * sizeof(dart::RawObject*)))
set $raw_class = (dart::RawClass*)((uword)$temp - dart::kHeapObjectTag)
printname $raw_class->name_
set $index = $index + 1
end
else
printf "Null\n"
end
end
define printrawclazz
if $argc == 1
set $raw_class = (dart::RawClass*)$arg0
set $is_interface = (uword)$raw_class->is_interface_
if ($is_interface)
printf "Interface Name : "
else
printf "Class Name : "
end
printname $raw_class->name_
printf "\nMethods :\n"
printfunctions $raw_class->functions_
printf "\nFields :\n"
printfields $raw_class->fields_
printf "\nInterfaces :\n"
printinterfaces $raw_class->interfaces_
set $raw_closure_function = (uword)$raw_class->closure_function_
if ($raw_closure_function != dart::Object::null())
printf "\nClosure Function :\n"
printrawfunction $raw_closure_function
end
printf "\n"
else
printf "Usage: printrawclazz <address of rawobject>\n"
end
end
document printrawclazz
Print contents of RawClass
end
define printrawfunction
if $argc == 1
set $raw_function = (dart::RawFunction*)$arg0
printf "Name : "
printname $raw_function->name_
set $raw_code = (uword)$raw_function->code_
printf "Code : \n"
if ($raw_code == dart::Object::null())
printf " not been generated yet\n"
else
printrawcode $raw_code
end
else
printf "Usage: printrawfunction <address of rawobject>\n"
end
end
document printrawfunction
Print contents of RawFunction
end
define printrawfield
if $argc == 1
set $raw_field = (dart::RawField*)$arg0
printf "Name : "
printname $raw_field->name_
printf "Value : "
printrawobject (uword)$raw_field->value_
else
printf "Usage: printrawfield <address of rawfield>\n"
end
end
document printrawfield
Print contents of RawField
end
define printrawscript
if $argc == 1
set $raw_script = (dart::RawScript*)$arg0
printf "printrawscript is not implemented yet\n"
else
printf "Usage: printrawscript <address of rawobject>\n"
end
end
document printrawscript
Print contents of RawScript
end
define printrawcode
if $argc == 1
set $raw_code = (dart::RawCode*)$arg0
set $instrs = (uword)$raw_code->instructions_ - dart::kHeapObjectTag
printrawinstructions $instrs
set $start = (uword)$raw_code + sizeof(dart::RawCode)
printf "Pointer Offsets :\n"
x/x $start, $start + $raw_code->pointer_offsets_length_
else
printf "Usage: printrawcode <address of rawobject>\n"
end
end
document printrawcode
Print contents of RawCode
end
define printrawinstructions
if $argc == 1
set $raw_instrs = (dart::RawInstructions*)$arg0
set $size = $raw_instrs->size_
set $alignment = 16
set $headersize = (sizeof(dart::RawInstructions) + $alignment -1) & -$alignment
set $start = (uword)$raw_instrs + \
(($headersize + $alignment - 1) & -$alignment)
printf "code_ = %p\n", $raw_instrs->code_
printf "size_ = %d\n", $raw_instrs->size_
disassemble $start, $start + ($size - $headersize)
else
printf "Usage: printrawinstructions <address of rawobject>\n"
end
end
document printrawinstructions
Print contents of RawInstructions
end
define printrawinstance
if $argc == 1
set $raw_instance = (dart::RawInstance*)$arg0
set $raw_class = (uword)((dart::RawObject*)$raw_instance)->class_ - dart::kHeapObjectTag
printf "Instance of class "
printname ((dart::RawClass*)$raw_class)->name_
else
printf "Usage: printrawinstance <address of rawobject>\n"
end
end
document printrawinstance
Print contents of RawInstance
end
define printrawinteger
if $argc == 1
set $raw_integer = (dart::RawInteger*)$arg0
printf "printrawinteger is not implemented yet\n"
else
printf "Usage: printrawinteger <address of rawobject>\n"
end
end
document printrawinteger
Print contents of RawInteger
end
define printrawdouble
if $argc == 1
set $raw_double = (dart::RawDouble*)$arg0
printf "printrawdouble is not implemented yet\n"
else
printf "Usage: printrawdouble <address of rawobject>\n"
end
end
document printrawdouble
Print contents of RawDouble
end
define printrawstring
if $argc == 1
set $raw_string = (dart::RawString*)$arg0
printf "printrawstring is not implemented yet\n"
else
printf "Usage: printrawstring <address of rawobject>\n"
end
end
document printrawstring
Print contents of RawString
end
define printrawonebytestring
if $argc == 1
set $raw_onebytestring = (dart::RawOneByteString*)$arg0
set $length = (uword)($raw_onebytestring->length_) >> dart::kSmiTagMask
printf "Length = %d\n", $length
printf "Hash = %d\n", $raw_onebytestring->hash_
set $offset = sizeof(dart::RawOneByteString)
while $length > 0
printf "%c", *((char*)((uword)$raw_onebytestring + $offset))
set $offset = $offset + 1
set $length = $length - 1
end
printf "\n"
else
printf "Usage: printrawonebytestring <address of rawobject>\n"
end
end
document printrawonebytestring
Print contents of RawString
end
# TODO(asiva): This function can be called recursively when we are
# printing other objects so we need to save and restore variables.
define printrawarray
if $argc == 1
set $raw_array = (dart::RawArray*)$arg0
printf "Array Length = %d\n", (uword)$raw_array->length_ >> dart::kSmiTagMask
set $index = 0
while $index < (uword)$raw_array->length_ >> dart::kSmiTagMask
printf "Element %d:\n", $index
set $temp = *(dart::RawObject*)((uword)$raw_array + \
sizeof(dart::RawArray) + \
($index * sizeof(dart::RawObject*)))
printrawobject $temp
set $index = $index + 1
end
else
printf "Usage: printrawarray <address of rawobject>\n"
end
end
document printrawarray
Print contents of RawArray
end
define printrawclosure
if $argc == 1
set $raw_closure = (dart::RawClosure*)$arg0
printf "class_ = %p\n", $raw_closure->class_
printf "context_ = %p\n", $raw_closure->context_
else
printf "Usage: printrawclosure <address of rawobject>\n"
end
end
document printrawclosure
Print contents of RawClosure
end
define printrawcontext
if $argc == 1
set $raw_context = (dart::RawContext*)$arg0
printf "parent_ = %p\n", $raw_context->parent_
printf "isolate_ = %p\n", $raw_context->isolate_
printf "num_variables_ = %d\n", $raw_context->num_variables_
set $index = 0
while $index < (uword)$raw_context->num_variables_
printf "Variable %d:\n", $index
set $temp = *(dart::RawObject*)((uword)$raw_context + \
sizeof(dart::RawContext) + \
($index * sizeof(dart::RawObject*)))
printrawobject $temp
set $index = $index + 1
end
else
printf "Usage: printrawcontext <address of rawobject>\n"
end
end
document printrawcontext
Print contents of RawContext
end
define printrawcontextscope
if $argc == 1
set $raw_context_scope = (dart::RawContext*)$arg0
printf "num_variables_ = %d\n", $raw_context_scope->num_variables_
else
printf "Usage: printrawcontextscope <address of rawobject>\n"
end
end
document printrawcontextscope
Print contents of RawContextScope
end
# TODO(asiva): This function can be called recursively when we are
# printing other objects so we need to save and restore variables.
define printrawobject
if $argc == 1
set $raw_object = (uword)$arg0
if ($raw_object & dart::kSmiTagMask) == dart::kHeapObjectTag
set $raw_object = (uword)$raw_object - dart::kHeapObjectTag
set $raw_class = (uword)((dart::RawObject*)$raw_object)->class_ - dart::kHeapObjectTag
set $type = ((dart::RawClass*)$raw_class)->instance_kind_
set $type_found = false
if $type == dart::kClass
printrawclazz $raw_object
set $type_found = true
end
if $type == dart::kFunction
printrawfunction $raw_object
set $type_found = true
end
if $type == dart::kScript
printrawscript $raw_object
set $type_found = true
end
if $type == dart::kCode
printrawcode $raw_object
set $type_found = true
end
if $type == dart::kInstructions
printrawinstructions $raw_object
set $type_found = true
end
if $type == dart::kInstance
printrawinstance $raw_object
set $type_found = true
end
if $type == dart::kNumber
printf "dump of RawNumber is not implemented yet\n"
set $type_found = true
end
if $type == dart::kInteger
printrawinteger $raw_object
set $type_found = true
end
if $type == dart::kDouble
printrawdouble $raw_object
set $type_found = true
end
if $type == dart::kString
printrawstring $raw_object
set $type_found = true
end
if $type == dart::kOneByteString
printrawonebytestring $raw_object
set $type_found = true
end
if $type == dart::kArray
printrawarray $raw_object
set $type_found = true
end
if $type == dart::kClosure
printrawclosure $raw_object
set $type_found = true
end
if $type == dart::kContext
printrawcontext $raw_object
set $type_found = true
end
if $type == dart::kContextScope
printrawcontextscope $raw_object
set $type_found = true
end
if $type_found == false
printf "unknown type %d\n", $type
end
else
print (uword)$raw_object >> dart::kSmiTagMask
end
else
printf "Usage: printrawobject <address of rawobject>\n"
end
end
document printrawobject
Print contents of specified raw object
end
define printobject
if $argc == 1
set $handle = $arg0
set $raw_object = $handle.raw_
printrawobject $raw_object
else
printf "Usage: printobject <handle reference>\n"
end
end
document printobject
Print contents of object pointed to by the handle
end
#
# =================================
# Zone and Handle monitoring macros
# =================================
#
#
# ===================
# Generic dump macros
# ===================
#
# Print as ascii characters.
define ascii_char
set $_c=*(unsigned char *)($arg0)
if ( $_c < 0x20 || $_c > 0x7E )
printf "."
else
printf "%c", $_c
end
end
document ascii_char
Print the ASCII value of arg0 or '.' if value is unprintable
end
# Hex dump (eight individual characters).
define hex_quad
printf "%02X %02X %02X %02X %02X %02X %02X %02X", \
*(unsigned char*)($arg0), *(unsigned char*)($arg0 + 1), \
*(unsigned char*)($arg0 + 2), *(unsigned char*)($arg0 + 3), \
*(unsigned char*)($arg0 + 4), *(unsigned char*)($arg0 + 5), \
*(unsigned char*)($arg0 + 6), *(unsigned char*)($arg0 + 7)
end
document hex_quad
Print eight hexadecimal bytes starting at arg0
end
# 16 byte hex dump.
define hexdump
printf "%08X : ", $arg0
hex_quad $arg0
printf " - "
hex_quad ($arg0+8)
printf " "
ascii_char ($arg0)
ascii_char ($arg0+1)
ascii_char ($arg0+2)
ascii_char ($arg0+3)
ascii_char ($arg0+4)
ascii_char ($arg0+5)
ascii_char ($arg0+6)
ascii_char ($arg0+7)
ascii_char ($arg0+8)
ascii_char ($arg0+9)
ascii_char ($arg0+0xA)
ascii_char ($arg0+0xB)
ascii_char ($arg0+0xC)
ascii_char ($arg0+0xD)
ascii_char ($arg0+0xE)
ascii_char ($arg0+0xF)
printf "\n"
end
document hexdump
Display a 16-byte hex/ASCII dump of arg0
end
# data dump.
define ddump
printf "[%04X:%08X]------------------------", $ds, $data_addr
printf "---------------------------------[ data]\n"
set $_count=0
while ( $_count < $arg0 )
set $_i=($_count*0x10)
hexdump ($data_addr+$_i)
set $_count++
end
end
document ddump
Display $arg0 lines of hexdump for address $data_addr
end
define dd
set $data_addr=$arg0
ddump 0x10
end
document dd
Display 16 lines of a hex dump for $arg0
end
define ddx
x/10x $arg0
end
document ddx
Display 16 lines of a hex dump for $arg0
end
define ddi
x/10i $arg0
end
document ddi
Display 16 lines of a instructions for $arg0
end
#
# ===============
# Init parameters
# ===============
#
set print pretty on
#set disassembly-flavor intel