1*e3723e1fSApple OSS Distributionsfrom xnu import * 2*e3723e1fSApple OSS Distributions 3*e3723e1fSApple OSS Distributions@lldb_command('showmicrostackshot', 'O:', fancy=True) 4*e3723e1fSApple OSS Distributionsdef show_microstackshot(cmd_args=None, cmd_options={}, O=None): 5*e3723e1fSApple OSS Distributions """ 6*e3723e1fSApple OSS Distributions Show information about the microstackshot subsystem. 7*e3723e1fSApple OSS Distributions 8*e3723e1fSApple OSS Distributions Usage: (lldb) showmicrostackshot [-O <offset>] 9*e3723e1fSApple OSS Distributions """ 10*e3723e1fSApple OSS Distributions 11*e3723e1fSApple OSS Distributions metadata = kern.GetGlobalVariable('telemetry_metadata') 12*e3723e1fSApple OSS Distributions print('metadata:') 13*e3723e1fSApple OSS Distributions print('{:>12s}: {}'.format('generation', metadata.tm_generation)) 14*e3723e1fSApple OSS Distributions print('{:>12s}: {}'.format('samples', metadata.tm_samples_recorded)) 15*e3723e1fSApple OSS Distributions print('{:>12s}: {}'.format('skips', metadata.tm_samples_skipped)) 16*e3723e1fSApple OSS Distributions print('{:>12s}: {}'.format('source', metadata.tm_source)) 17*e3723e1fSApple OSS Distributions print('{:>12s}: {}'.format('period', metadata.tm_period)) 18*e3723e1fSApple OSS Distributions 19*e3723e1fSApple OSS Distributions kern_ring = kern.GetGlobalVariable("_telemetry_kernel_ring") 20*e3723e1fSApple OSS Distributions print() 21*e3723e1fSApple OSS Distributions print('kernel ringbuffer:') 22*e3723e1fSApple OSS Distributions print('{:>12s}: {}'.format('capacity', kern_ring.mr_capacity)) 23*e3723e1fSApple OSS Distributions print('{:>12s}: {}'.format('head', kern_ring.mr_head_tail.mrht_head)) 24*e3723e1fSApple OSS Distributions print('{:>12s}: {}'.format('tail', kern_ring.mr_head_tail.mrht_tail)) 25*e3723e1fSApple OSS Distributions print('{:>12s}: {}'.format('available', (kern_ring.mr_head_tail.mrht_tail - kern_ring.mr_head_tail.mrht_head) % kern_ring.mr_capacity)) 26*e3723e1fSApple OSS Distributions 27*e3723e1fSApple OSS Distributions if kern_ring.mr_head_tail.mrht_tail & 0x3 != 0: 28*e3723e1fSApple OSS Distributions print('tail is not aligned') 29*e3723e1fSApple OSS Distributions return 30*e3723e1fSApple OSS Distributions 31*e3723e1fSApple OSS Distributions print() 32*e3723e1fSApple OSS Distributions print('kernel samples:') 33*e3723e1fSApple OSS Distributions base_kern_text = kern.GetGlobalVariable('vm_kernel_stext') 34*e3723e1fSApple OSS Distributions 35*e3723e1fSApple OSS Distributions next_record = unsigned(cmd_options.get('-O') or kern_ring.mr_head_tail.mrht_tail) 36*e3723e1fSApple OSS Distributions print(next_record) 37*e3723e1fSApple OSS Distributions while (kern_ring.mr_head_tail.mrht_head - next_record) > 0: 38*e3723e1fSApple OSS Distributions next_record_ptr = kern_ring.mr_buffer + (next_record % kern_ring.mr_capacity) 39*e3723e1fSApple OSS Distributions next_sample = kern.GetValueFromAddress(next_record_ptr, 'struct _telemetry_kernel_sample *') 40*e3723e1fSApple OSS Distributions if next_sample.tks_magic != xnudefines.TKS_MAGIC: 41*e3723e1fSApple OSS Distributions print('magic value for sample at position {} is {}, not {}'.format( 42*e3723e1fSApple OSS Distributions next_record % kern_ring.mr_capacity, next_sample.tks_magic, 43*e3723e1fSApple OSS Distributions xnudefines.TKS_MAGIC)) 44*e3723e1fSApple OSS Distributions break 45*e3723e1fSApple OSS Distributions print('{}.{:09d}: @{} thread 0x{:x} on CPU {}:'.format(next_sample.tks_time_secs, 46*e3723e1fSApple OSS Distributions next_sample.tks_time_usecs * 1000, next_record, next_sample.tks_thread_id, 47*e3723e1fSApple OSS Distributions next_sample.tks_cpu)) 48*e3723e1fSApple OSS Distributions call_stack_size = unsigned(next_sample.tks_call_stack_size) 49*e3723e1fSApple OSS Distributions next_record += sizeof('struct _telemetry_kernel_sample') + call_stack_size 50*e3723e1fSApple OSS Distributions call_stack = Cast(addressof(next_sample[1]), 'uint32_t *') 51*e3723e1fSApple OSS Distributions for i in range(call_stack_size // 4): 52*e3723e1fSApple OSS Distributions if call_stack[i] == 0: 53*e3723e1fSApple OSS Distributions continue 54*e3723e1fSApple OSS Distributions addr = base_kern_text + call_stack[i] 55*e3723e1fSApple OSS Distributions syms = kern.SymbolicateFromAddress(addr) 56*e3723e1fSApple OSS Distributions name = syms[0].GetName() if syms else '... try showkmodaddr ...' 57*e3723e1fSApple OSS Distributions print('\t0x{:16x} ({})'.format(addr, name)) 58*e3723e1fSApple OSS Distributions 59*e3723e1fSApple OSS Distributions print('end at {}'.format(next_record)) 60