goobjfile.pretty_printers.extend([makematcher(var) for var in vars().values() if hasattr(var, 'pattern')])
+
+#
+# Utilities
+#
+
+def pc_to_int(pc):
+ # python2 will not cast pc (type void*) to an int cleanly
+ # instead python2 and python3 work with the hex string representation
+ # of the void pointer which we can parse back into an int.
+ # int(pc) will not work.
+ try:
+ # python3 / newer versions of gdb
+ pc = int(pc)
+ except gdb.error:
+ # str(pc) can return things like
+ # "0x429d6c <runtime.gopark+284>", so
+ # chop at first space.
+ pc = int(str(pc).split(None, 1)[0], 16)
+ return pc
+
+
#
# For reference, this is what we're trying to do:
# eface: p *(*(struct 'runtime.rtype'*)'main.e'->type_->data)->string
if ptr['m']:
s = '*'
pc = ptr['sched']['pc'].cast(vp)
- # python2 will not cast pc (type void*) to an int cleanly
- # instead python2 and python3 work with the hex string representation
- # of the void pointer which we can parse back into an int.
- # int(pc) will not work.
- try:
- #python3 / newer versions of gdb
- pc = int(pc)
- except gdb.error:
- # str(pc) can return things like
- # "0x429d6c <runtime.gopark+284>", so
- # chop at first space.
- pc = int(str(pc).split(None, 1)[0], 16)
+ pc = pc_to_int(pc)
blk = gdb.block_for_pc(pc)
status = int(ptr['atomicstatus'])
st = sts.get(status, "unknown(%d)" % status)
if not pc:
print("No such goroutine: ", goid)
return
- try:
- #python3 / newer versions of gdb
- pc = int(pc)
- except gdb.error:
- pc = int(str(pc).split(None, 1)[0], 16)
+ pc = pc_to_int(pc)
save_frame = gdb.selected_frame()
gdb.parse_and_eval('$save_sp = $sp')
gdb.parse_and_eval('$save_pc = $pc')