bthread_regs , print bthread registers
| 174 | pass |
| 175 | |
| 176 | class BthreadRegsCmd(gdb.Command): |
| 177 | """bthread_regs <id>, print bthread registers""" |
| 178 | def __init__(self): |
| 179 | gdb.Command.__init__(self, "bthread_regs", gdb.COMMAND_STACK, gdb.COMPLETE_NONE) |
| 180 | |
| 181 | def invoke(self, arg, tty): |
| 182 | global status |
| 183 | global bthreads |
| 184 | if not status: |
| 185 | print("Not in bthread debug mode") |
| 186 | return |
| 187 | if not arg: |
| 188 | print("bthread_regs <id>, see 'bthread_list'") |
| 189 | return |
| 190 | bthread_id = int(arg) |
| 191 | if bthread_id >= len(bthreads): |
| 192 | print("id {} exceeds max bthread nums {}".format(bthread_id, len(bthreads))) |
| 193 | return |
| 194 | stack = bthreads[bthread_id]["stack"] |
| 195 | if str(stack) == "0x0": |
| 196 | print("this bthread has no stack") |
| 197 | return |
| 198 | context = gdb.parse_and_eval("(*(('bthread::ContextualStack' *){})).context".format(stack)) |
| 199 | rip = int(gdb.parse_and_eval("*(uint64_t*)({}+7*8)".format(context))) |
| 200 | rbp = int(gdb.parse_and_eval("*(uint64_t*)({}+6*8)".format(context))) |
| 201 | rbx = int(gdb.parse_and_eval("*(uint64_t*)({}+5*8)".format(context))) |
| 202 | r15 = int(gdb.parse_and_eval("*(uint64_t*)({}+4*8)".format(context))) |
| 203 | r14 = int(gdb.parse_and_eval("*(uint64_t*)({}+3*8)".format(context))) |
| 204 | r13 = int(gdb.parse_and_eval("*(uint64_t*)({}+2*8)".format(context))) |
| 205 | r12 = int(gdb.parse_and_eval("*(uint64_t*)({}+1*8)".format(context))) |
| 206 | rsp = int(gdb.parse_and_eval("{}+8*8".format(context))) |
| 207 | print("rip: 0x{:x}\nrsp: 0x{:x}\nrbp: 0x{:x}\nrbx: 0x{:x}\nr15: 0x{:x}\nr14: 0x{:x}\nr13: 0x{:x}\nr12: 0x{:x}".format(rip, rsp, rbp, rbx, r15, r14, r13, r12)) |
| 208 | |
| 209 | class BthreadMetaCmd(gdb.Command): |
| 210 | """bthread_meta <id>, print task meta by id""" |