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