Changeset 5407cdc for tools/gdb/utils-gdb.py
- Timestamp:
- Apr 28, 2021, 4:56:50 PM (5 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- 8d66610
- Parents:
- feacef9 (diff), b7fd2db6 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - File:
-
- 1 edited
-
tools/gdb/utils-gdb.py (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
tools/gdb/utils-gdb.py
rfeacef9 r5407cdc 23 23 gdb.execute('handle SIGUSR1 nostop noprint pass') 24 24 25 CfaTypes = collections.namedtuple('CfaTypes', 'cluster_ptr processor_ptr thread_ptr int_ptr thread_state ')25 CfaTypes = collections.namedtuple('CfaTypes', 'cluster_ptr processor_ptr thread_ptr int_ptr thread_state yield_state') 26 26 27 27 class ThreadInfo: … … 52 52 # GDB types for various structures/types in CFA 53 53 return CfaTypes(cluster_ptr = gdb.lookup_type('struct cluster').pointer(), 54 processor_ptr = gdb.lookup_type('struct processor').pointer(), 55 thread_ptr = gdb.lookup_type('struct $thread').pointer(), 56 int_ptr = gdb.lookup_type('int').pointer(), 57 thread_state = gdb.lookup_type('enum __Coroutine_State')) 54 processor_ptr = gdb.lookup_type('struct processor').pointer(), 55 thread_ptr = gdb.lookup_type('struct $thread').pointer(), 56 int_ptr = gdb.lookup_type('int').pointer(), 57 thread_state = gdb.lookup_type('enum __Coroutine_State'), 58 yield_state = gdb.lookup_type('enum __Preemption_Reason')) 58 59 59 60 def get_addr(addr): … … 371 372 def print_thread(self, thread, tid, marked): 372 373 cfa_t = get_cfa_types() 373 self.print_formatted(marked, tid, thread['self_cor']['name'].string(), str(thread['state'].cast(cfa_t.thread_state)), str(thread)) 374 ys = str(thread['preempted'].cast(cfa_t.yield_state)) 375 if ys == '_X15__NO_PREEMPTIONKM19__Preemption_Reason_1': 376 state = str(thread['state'].cast(cfa_t.thread_state)) 377 elif ys == '_X18__ALARM_PREEMPTIONKM19__Preemption_Reason_1': 378 state = 'preempted' 379 elif ys == '_X19__MANUAL_PREEMPTIONKM19__Preemption_Reason_1': 380 state = 'yield' 381 elif ys == '_X17__POLL_PREEMPTIONKM19__Preemption_Reason_1': 382 state = 'poll' 383 else: 384 print("error: thread {} in undefined preemption state {}".format(thread, ys)) 385 state = 'error' 386 self.print_formatted(marked, tid, thread['self_cor']['name'].string(), state, str(thread)) 374 387 375 388 def print_threads_by_cluster(self, cluster, print_system = False): … … 480 493 context = thread['context'] 481 494 495 496 497 # must be at frame 0 to set pc register 498 gdb.execute('select-frame 0') 499 if gdb.selected_frame().architecture().name() != 'i386:x86-64': 500 print('gdb debugging only supported for i386:x86-64 for now') 501 return 502 503 # gdb seems to handle things much better if we pretend we just entered the context switch 504 # pretend the pc is __cfactx_switch and adjust the sp, base pointer doesn't need to change 482 505 # lookup for sp,fp and uSwitch 483 xsp = context['SP'] + 4 8506 xsp = context['SP'] + 40 # 40 = 5 64bit registers : %r15, %r14, %r13, %r12, %rbx WARNING: x64 specific 484 507 xfp = context['FP'] 485 508 486 509 # convert string so we can strip out the address 487 510 try: 488 xpc = get_addr(gdb.parse_and_eval('__cfactx_switch').address + 28)511 xpc = get_addr(gdb.parse_and_eval('__cfactx_switch').address) 489 512 except: 490 513 print("here") 491 514 return 492 493 # must be at frame 0 to set pc register494 gdb.execute('select-frame 0')495 515 496 516 # push sp, fp, pc into a global stack … … 503 523 504 524 # update registers for new task 505 print('switching to ') 525 # print('switching to {} ({}) : [{}, {}, {}]'.format(thread['self_cor']['name'].string(), str(thread), str(xsp), str(xfp), str(xpc))) 526 print('switching to thread {} ({})'.format(str(thread), thread['self_cor']['name'].string())) 506 527 gdb.execute('set $rsp={}'.format(xsp)) 507 528 gdb.execute('set $rbp={}'.format(xfp)) … … 552 573 553 574 argv = parse(arg) 554 print(argv)555 575 if argv[0].isdigit(): 556 576 cname = " ".join(argv[1:]) if len(argv) > 1 else None
Note:
See TracChangeset
for help on using the changeset viewer.