blob: 181da66b9c9246d89c987a25b874f560b80903e4 [file] [log] [blame]
#
# GDB functions for debugging the Z Garbage Collector
#
printf "Loading zDebug.gdb\n"
# Print Klass*
define zpk
printf "Klass: %s\n", (char*)((Klass*)($arg0))->_name->_body
end
# Print oop
define zpo
set $obj = (oopDesc*)($arg0)
printf "Oop: 0x%016llx\tState: ", (uintptr_t)$obj
if ((uintptr_t)$obj & (uintptr_t)ZPointerStoreGoodMask)
printf "Good "
if ((uintptr_t)$obj & (uintptr_t)ZPointerRemapped)
printf "(Remapped)"
else
if ((uintptr_t)$obj & (uintptr_t)ZPointerMarkedOld)
printf "(MarkedOld)"
else
printf "(Unknown)"
end
end
else
printf "Bad "
if ((uintptr_t)ZPointerStoreGoodMask & (uintptr_t)ZPointerMarkedOld)
# Should be marked
if ((uintptr_t)$obj & (uintptr_t)ZPointerRemapped)
printf "(Not Marked, Remapped)"
else
printf "(Not Marked, Not Remapped)"
end
else
if ((uintptr_t)ZPointerStoreGoodMask & (uintptr_t)ZPointerRemapped)
# Should be remapped
if ((uintptr_t)$obj & (uintptr_t)ZPointerMarkedOld)
printf "(Marked, Not Remapped)"
else
printf "(Not Marked, Not Remapped)"
end
else
# Unknown
printf "(Unknown)"
end
end
end
printf "\t Page: %llu\n", ((uintptr_t)$obj & ZAddressOffsetMask) >> ZGranuleSizeShift
x/16gx $obj
if (UseCompressedClassPointers)
set $klass = (Klass*)(void*)((uintptr_t)CompressedKlassPointers::_narrow_klass._base +((uintptr_t)$obj->_metadata->_compressed_klass << CompressedKlassPointers::_narrow_klass._shift))
else
set $klass = $obj->_metadata->_klass
end
printf "Mark: 0x%016llx\tKlass: %s\n", (uintptr_t)$obj->_mark, (char*)$klass->_name->_body
end
# Print heap page by page table index
define zpp
set $page = (ZPage*)((uintptr_t)ZHeap::_heap._page_table._map._map[($arg0)] & ~1)
printf "Page %p\n", $page
print *$page
end
# Print page_table
define zpt
printf "Pagetable (first 128 slots)\n"
x/128gx ZHeap::_heap._page_table._map._map
end
# Print live map
define __zmarked
set $livemap = $arg0
set $bit = $arg1
set $size = $livemap._bitmap._size
set $segment = $size / ZLiveMap::nsegments
set $segment_bit = 1 << $segment
printf "Segment is "
if !($livemap._segment_live_bits & $segment_bit)
printf "NOT "
end
printf "live (segment %d)\n", $segment
if $bit >= $size
print "Error: Bit %z out of bounds (bitmap size %z)\n", $bit, $size
else
set $word_index = $bit / 64
set $bit_index = $bit % 64
set $word = $livemap._bitmap._map[$word_index]
set $live_bit = $word & (1 << $bit_index)
printf "Object is "
if $live_bit == 0
printf "NOT "
end
printf "live (word index %d, bit index %d)\n", $word_index, $bit_index
end
end
define zmarked
set $addr = $arg0
set $obj = ((uintptr_t)$addr & ZAddressOffsetMask)
set $page_index = $obj >> ZGranuleSizeShift
set $page_entry = (uintptr_t)ZHeap::_heap._page_table._map._map[$page_index]
set $page = (ZPage*)($page_entry & ~1)
set $page_start = (uintptr_t)$page._virtual._start
set $page_end = (uintptr_t)$page._virtual._end
set $page_seqnum = $page._livemap._seqnum
set $global_seqnum = ZGlobalSeqNum
if $obj < $page_start || $obj >= $page_end
printf "Error: %p not in page %p (start %p, end %p)\n", $obj, $page, $page_start, $page_end
else
printf "Page is "
if $page_seqnum != $global_seqnum
printf "NOT "
end
printf "live (page %p, page seqnum %d, global seqnum %d)\n", $page, $page_seqnum, $global_seqnum
#if $page_seqnum == $global_seqnum
set $offset = $obj - $page_start
set $bit = $offset / 8
__zmarked $page._livemap $bit
#end
end
end
# For some reason gdb doesn't like ZGeneration::ZPhase::Mark etc.
# Use hard-coded values instead.
define z_print_phase
if $arg0 == 0
printf "Mark"
else
if $arg0 == 1
printf "MarkComplete"
else
if $arg0 == 2
printf "Relocate"
else
printf "Unknown"
end
end
end
end
define z_print_generation
printf "%u", $arg0->_seqnum
printf "/"
z_print_phase $arg0->_phase
end
define zz
printf "Old: "
z_print_generation ZHeap::_heap->_old
printf " | "
printf "Young: "
z_print_generation ZHeap::_heap->_young
printf "\n"
end
# Print heap information
define zph
printf "Heap\n"
printf " Young Phase: %u\n", ZHeap::_heap->_young->_phase
printf " Old Phase: %u\n", ZHeap::_heap->_old->_phase
printf " Young SeqNum: %u\n", ZHeap::_heap->_young->_seqnum
printf " Old SeqNum: %u\n", ZHeap::_heap->_old->_seqnum
printf " Offset Max: %-15llu (0x%llx)\n", ZAddressOffsetMax, ZAddressOffsetMax
printf " Page Size Small: %-15llu (0x%llx)\n", ZPageSizeSmall, ZPageSizeSmall
printf " Page Size Medium: %-15llu (0x%llx)\n", ZPageSizeMedium, ZPageSizeMedium
printf "Metadata Bits\n"
printf " Good: 0x%016llx\n", ZPointerStoreGoodMask
printf " Bad: 0x%016llx\n", ZPointerStoreBadMask
printf " MarkedYoung: 0x%016llx\n", ZPointerMarkedYoung
printf " MarkedOld: 0x%016llx\n", ZPointerMarkedOld
printf " Remapped: 0x%016llx\n", ZPointerRemapped
end
define print_bits
set $value=$arg0
set $bits=$arg1
set $bit=0
while ($bit < $bits)
set $bit_pos = (1ull << ($bits - 1 - $bit))
printf "%d", ($arg0 & $bit_pos) != 0
set $bit = $bit + 1
end
printf " <%lX>", $value
end
define print_bits8
print_bits $arg0 8
end
define print_s_bits8
printf $arg0
print_bits8 $arg1
end
# Print metadata information
define zpm
printf "Metadata Load Bits "
print_s_bits8 "\n Mask: " ZPointerLoadMetadataMask
print_s_bits8 "\n Good: " ZPointerLoadGoodMask
print_s_bits8 "\n Remapped: " ZPointerRemapped
print_s_bits8 "\n Bad: " ZPointerLoadBadMask
printf "\n "
printf "\nMetadata Store Bits "
print_s_bits8 "\n Mask: " ZPointerStoreMetadataMask
print_s_bits8 "\n Good: " ZPointerStoreGoodMask
print_s_bits8 "\n Bad: " ZPointerStoreBadMask
print_s_bits8 "\n MarkedYoung: " ZPointerMarkedYoung
print_s_bits8 "\n MarkedOld: " ZPointerMarkedOld
print_s_bits8 "\n Finalizable: " ZPointerFinalizable
printf "\n"
end
# End of file