1 # 2 # GDB functions for debugging the Z Garbage Collector 3 # 4 5 printf "Loading zDebug.gdb\n" 6 7 # Print Klass* 8 define zpk 9 printf "Klass: %s\n", (char*)((Klass*)($arg0))->_name->_body 10 end 11 12 # Print oop 13 define zpo 14 set $obj = (oopDesc*)($arg0) 15 16 printf "Oop: 0x%016llx\tState: ", (uintptr_t)$obj 17 if ((uintptr_t)$obj & (uintptr_t)ZAddressGoodMask) 18 printf "Good " 19 if ((uintptr_t)$obj & (uintptr_t)ZAddressMetadataRemapped) 20 printf "(Remapped)" 21 else 22 if ((uintptr_t)$obj & (uintptr_t)ZAddressMetadataMarked) 23 printf "(Marked)" 24 else 25 printf "(Unknown)" 26 end 27 end 28 else 29 printf "Bad " 30 if ((uintptr_t)ZAddressGoodMask & (uintptr_t)ZAddressMetadataMarked) 31 # Should be marked 32 if ((uintptr_t)$obj & (uintptr_t)ZAddressMetadataRemapped) 33 printf "(Not Marked, Remapped)" 34 else 35 printf "(Not Marked, Not Remapped)" 36 end 37 else 38 if ((uintptr_t)ZAddressGoodMask & (uintptr_t)ZAddressMetadataRemapped) 39 # Should be remapped 40 if ((uintptr_t)$obj & (uintptr_t)ZAddressMetadataMarked) 41 printf "(Marked, Not Remapped)" 42 else 43 printf "(Not Marked, Not Remapped)" 44 end 45 else 46 # Unknown 47 printf "(Unknown)" 48 end 49 end 50 end 51 printf "\t Page: %llu\n", ((uintptr_t)$obj & ZAddressOffsetMask) >> ZGranuleSizeShift 52 x/16gx $obj 53 printf "Mark: 0x%016llx\tKlass: %s\n", (uintptr_t)$obj->_mark, (char*)$obj->_metadata->_klass->_name->_body 54 end 55 56 # Print heap page by pagetable index 57 define zpp 58 set $page = (ZPage*)((uintptr_t)ZHeap::_heap._pagetable._map._map[($arg0)] & ~1) 59 printf "Page %p\n", $page 60 print *$page 61 end 62 63 # Print pagetable 64 define zpt 65 printf "Pagetable (first 128 slots)\n" 66 x/128gx ZHeap::_heap._pagetable._map._map 67 end 68 69 # Print live map 70 define __zmarked 71 set $livemap = $arg0 72 set $bit = $arg1 73 set $size = $livemap._bitmap._size 74 set $segment = $size / ZLiveMap::nsegments 75 set $segment_bit = 1 << $segment 76 77 printf "Segment is " 78 if !($livemap._segment_live_bits & $segment_bit) 79 printf "NOT " 80 end 81 printf "live (segment %d)\n", $segment 82 83 if $bit >= $size 84 print "Error: Bit %z out of bounds (bitmap size %z)\n", $bit, $size 85 else 86 set $word_index = $bit / 64 87 set $bit_index = $bit % 64 88 set $word = $livemap._bitmap._map[$word_index] 89 set $live_bit = $word & (1 << $bit_index) 90 91 printf "Object is " 92 if $live_bit == 0 93 printf "NOT " 94 end 95 printf "live (word index %d, bit index %d)\n", $word_index, $bit_index 96 end 97 end 98 99 define zmarked 100 set $addr = $arg0 101 set $obj = ((uintptr_t)$addr & ZAddressOffsetMask) 102 set $page_index = $obj >> ZGranuleSizeShift 103 set $page_entry = (uintptr_t)ZHeap::_heap._pagetable._map._map[$page_index] 104 set $page = (ZPage*)($page_entry & ~1) 105 set $page_start = (uintptr_t)$page._virtual._start 106 set $page_end = (uintptr_t)$page._virtual._end 107 set $page_seqnum = $page._livemap._seqnum 108 set $global_seqnum = ZGlobalSeqNum 109 110 if $obj < $page_start || $obj >= $page_end 111 printf "Error: %p not in page %p (start %p, end %p)\n", $obj, $page, $page_start, $page_end 112 else 113 printf "Page is " 114 if $page_seqnum != $global_seqnum 115 printf "NOT " 116 end 117 printf "live (page %p, page seqnum %d, global seqnum %d)\n", $page, $page_seqnum, $global_seqnum 118 119 #if $page_seqnum == $global_seqnum 120 set $offset = $obj - $page_start 121 set $bit = $offset / 8 122 __zmarked $page._livemap $bit 123 #end 124 end 125 end 126 127 # Print heap information 128 define zph 129 printf "Address Space\n" 130 printf " Start: 0x%llx\n", ZAddressSpaceStart 131 printf " End: 0x%llx\n", ZAddressSpaceEnd 132 printf " Size: %-15llu (0x%llx)\n", ZAddressSpaceSize, ZAddressSpaceSize 133 printf "Heap\n" 134 printf " GlobalPhase: %u\n", ZGlobalPhase 135 printf " GlobalSeqNum: %u\n", ZGlobalSeqNum 136 printf " Offset Max: %-15llu (0x%llx)\n", ZAddressOffsetMax, ZAddressOffsetMax 137 printf " Page Size Small: %-15llu (0x%llx)\n", ZPageSizeSmall, ZPageSizeSmall 138 printf " Page Size Medium: %-15llu (0x%llx)\n", ZPageSizeMedium, ZPageSizeMedium 139 printf "Metadata Bits\n" 140 printf " Good: 0x%016llx\n", ZAddressGoodMask 141 printf " Bad: 0x%016llx\n", ZAddressBadMask 142 printf " WeakBad: 0x%016llx\n", ZAddressWeakBadMask 143 printf " Marked: 0x%016llx\n", ZAddressMetadataMarked 144 printf " Remapped: 0x%016llx\n", ZAddressMetadataRemapped 145 end 146 147 # End of file