Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • tools/gdb/utils-gdb.py

    r6abcb4d rd8b17e2  
    2323gdb.execute('handle SIGUSR1 nostop noprint pass')
    2424
    25 CfaTypes = collections.namedtuple('CfaTypes', 'cluster_ptr processor_ptr thread_ptr int_ptr thread_state yield_state')
     25CfaTypes = collections.namedtuple('CfaTypes', 'cluster_ptr processor_ptr thread_ptr int_ptr thread_state')
    2626
    2727class ThreadInfo:
     
    5252        # GDB types for various structures/types in CFA
    5353        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'),
    58                 yield_state = gdb.lookup_type('enum __Preemption_Reason'))
     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'))
    5958
    6059def get_addr(addr):
     
    372371        def print_thread(self, thread, tid, marked):
    373372                cfa_t = get_cfa_types()
    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))
     373                self.print_formatted(marked, tid, thread['self_cor']['name'].string(), str(thread['state'].cast(cfa_t.thread_state)), str(thread))
    387374
    388375        def print_threads_by_cluster(self, cluster, print_system = False):
     
    493480                context = thread['context']
    494481
    495 
     482                # lookup for sp,fp and uSwitch
     483                xsp = context['SP'] + 48
     484                xfp = context['FP']
     485
     486                # convert string so we can strip out the address
     487                try:
     488                        xpc = get_addr(gdb.parse_and_eval('__cfactx_switch').address + 28)
     489                except:
     490                        print("here")
     491                        return
    496492
    497493                # must be at frame 0 to set pc register
    498494                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
    505                 # lookup for sp,fp and uSwitch
    506                 xsp = context['SP'] + 40 # 40 = 5 64bit registers : %r15, %r14, %r13, %r12, %rbx WARNING: x64 specific
    507                 xfp = context['FP']
    508 
    509                 # convert string so we can strip out the address
    510                 try:
    511                         xpc = get_addr(gdb.parse_and_eval('__cfactx_switch').address)
    512                 except:
    513                         print("here")
    514                         return
    515495
    516496                # push sp, fp, pc into a global stack
     
    523503
    524504                # update registers for new task
    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()))
     505                print('switching to ')
    527506                gdb.execute('set $rsp={}'.format(xsp))
    528507                gdb.execute('set $rbp={}'.format(xfp))
     
    573552
    574553                argv = parse(arg)
     554                print(argv)
    575555                if argv[0].isdigit():
    576556                        cname = " ".join(argv[1:]) if len(argv) > 1 else None
Note: See TracChangeset for help on using the changeset viewer.