# # Kernel gdb macros # # These gdb macros should be useful during kernel development in # determining what's going on in the kernel. # # All the convenience variables used by these macros begin with $kgm_ set $kgm_dummy = &proc0 set $kgm_dummy = &kmod echo Loading Kernel GDB Macros package. Type "help kgm" for more info.\n define kgm printf "" echo These are the gdb macros for kernel debugging. Type "help kgm" for more info.\n end document kgm | These are the kernel gdb macros. These gdb macros are intended to be | used when debugging a remote kernel via the kdp protocol. Typically, you | would connect to your remote target like so: | (gdb) target remote-kdp | (gdb) attach | | The following macros are available in this package: | | showalltasks Display a summary listing of all tasks | showallthreads Display info about all threads in the system | showallstacks Display the stack for each thread in the system | showcurrentthreads Display info about the thread running on each cpu | showcurrentstacks Display the stack for the thread running on each cpu | showallvm Display a summary listing of all the vm maps | showallvme Display a summary listing of all the vm map entries | showallipc Display a summary listing of all the ipc spaces | showallrights Display a summary listing of all the ipc rights | showallkmods Display a summary listing of all the kernel modules | | showtask Display info about the specified task | showtaskthreads Display info about the threads in the task | showtaskstacks Display the stack for each thread in the task | showtaskvm Display info about the specified task's vm_map | showtaskvme Display info about the task's vm_map entries | showtaskipc Display info about the specified task's ipc space | showtaskrights Display info about the task's ipc space entries | | showact Display info about a thread specified by activation | showactstack Display the stack for a thread specified by activation | | showmap Display info about the specified vm_map | showmapvme Display a summary list of the specified vm_map's entries | | showipc Display info about the specified ipc space | showrights Display a summary list of all the rights in an ipc space | | showpid Display info about the process identified by pid | showproc Display info about the process identified by proc struct | | showkmod Display info about a kernel module | showkmodaddr Given an address, display the kernel module and offset | | dumpcallqueue Dump out all the entries given a queue head | | zprint Display info about the memory zones | paniclog Display the panic log info | | switchtoact Switch to different context specified by activation | switchtoctx Switch to different context | resetctx Reset context | resume_on Resume when detaching from gdb | resume_off Don't resume when detaching from gdb | | Type "help " for more specific help on a particular macro. | Type "show user " to see what the macro is really doing. end define showkmodheader printf "kmod address size " printf "id refs version name\n" end define showkmodint set $kgm_kmodp = (struct kmod_info *)$arg0 printf "0x%08x ", $arg0 printf "0x%08x ", $kgm_kmodp->address printf "0x%08x ", $kgm_kmodp->size printf "%3d ", $kgm_kmodp->id printf "%5d ", $kgm_kmodp->reference_count printf "%10s ", &$kgm_kmodp->version printf "%s\n", &$kgm_kmodp->name end set $kgm_kmodmin = 0xffffffff set $kgm_fkmodmin = 0x00000000 set $kgm_kmodmax = 0x00000000 set $kgm_fkmodmax = 0xffffffff set $kgm_pkmod = 0 set $kgm_pkmodst = 0 set $kgm_pkmoden = 0 define showkmodaddr printf "0x%x" , $arg0 if ((unsigned int)$arg0 >= (unsigned int)$kgm_pkmodst) && ((unsigned int)$arg0 <= (unsigned int)$kgm_pkmoden) set $kgm_off = ((unsigned int)$arg0 - (unsigned int)$kgm_pkmodst) printf " <%s + 0x%x>", $kgm_pkmod->name, $kgm_off else if ((unsigned int)$arg0 <= (unsigned int)$kgm_fkmodmax) && ((unsigned int)$arg0 >= (unsigned int)$kgm_fkmodmin) set $kgm_kmodp = (struct kmod_info *)kmod while $kgm_kmodp set $kgm_kmod = *$kgm_kmodp if $kgm_kmod.address && ($kgm_kmod.address < $kgm_kmodmin) set $kgm_kmodmin = $kgm_kmod.address end if ($kgm_kmod.address + $kgm_kmod.size) > $kgm_kmodmax set $kgm_kmodmax = $kgm_kmod.address end set $kgm_off = ((unsigned int)$arg0 - (unsigned int)$kgm_kmod.address) if ($kgm_kmod.address <= $arg0) && ($kgm_off <= $kgm_kmod.size) printf " <%s + 0x%x>", $kgm_kmodp->name, $kgm_off set $kgm_pkmod = $kgm_kmodp set $kgm_pkmodst = $kgm_kmod.address set $kgm_pkmoden = $kgm_pkmodst + $kgm_kmod.size set $kgm_kmodp = 0 else set $kgm_kmodp = $kgm_kmod.next end end if !$kgm_pkmod set $kgm_fkmodmin = $kgm_kmodmin set $kgm_fkmodmax = $kgm_kmodmax end end end end document showkmodaddr | Given an address, print the offset and name for the kmod containing it | The following is the syntax: | (gdb) showkmodaddr end define showkmod showkmodheader showkmodint $arg0 end document showkmod | Routine to print info about a kernel module | The following is the syntax: | (gdb) showkmod end define showallkmods showkmodheader set $kgm_kmodp = (struct kmod_info *)kmod while $kgm_kmodp showkmodint $kgm_kmodp set $kgm_kmodp = $kgm_kmodp->next end end document showallkmods | Routine to print a summary listing of all the kernel modules | The following is the syntax: | (gdb) showallkmods end define showactheader printf " activation " printf "thread pri state wait_queue wait_event\n" end define showactint printf " 0x%08x ", $arg0 set $kgm_actp = *(struct thread *)$arg0 if $kgm_actp.thread set $kgm_thread = *$kgm_actp.thread printf "0x%08x ", $kgm_actp.thread printf "%3d ", $kgm_thread.sched_pri set $kgm_state = $kgm_thread.state if $kgm_state & 0x80 printf "I" end if $kgm_state & 0x40 printf "P" end if $kgm_state & 0x20 printf "A" end if $kgm_state & 0x10 printf "H" end if $kgm_state & 0x08 printf "U" end if $kgm_state & 0x04 printf "R" end if $kgm_state & 0x02 printf "S" end if $kgm_state & 0x01 printf "W\t" printf "0x%08x ", $kgm_thread.wait_queue output /a $kgm_thread.wait_event end if $arg1 != 0 if ($kgm_thread.kernel_stack != 0) if ($kgm_thread.reserved_stack != 0) printf "\n\t\treserved_stack=0x%08x", $kgm_thread.reserved_stack end printf "\n\t\tkernel_stack=0x%08x", $kgm_thread.kernel_stack if (machine_slot[0].cpu_type == 18) set $mysp = $kgm_actp->mact.pcb->save_r1 else set $kgm_statep = (struct i386_kernel_state *)($kgm_thread->kernel_stack + 0x4000 - sizeof(stru\ ct i386_kernel_state)) set $mysp = $kgm_statep->k_ebp end set $prevsp = 0 printf "\n\t\tstacktop=0x%08x", $mysp while ($mysp != 0) && (($mysp & 0xf) == 0) && ($mysp < 0xb0000000) && ($mysp > $prevsp) printf "\n\t\t0x%08x ", $mysp if (machine_slot[0].cpu_type == 18) set $kgm_return = *($mysp + 8) else set $kgm_return = *($mysp + 4) end if ($kgm_return > sectPRELINKB) showkmodaddr $kgm_return else if (machine_slot[0].cpu_type == 18) output /a * ($mysp + 8) else output /a * ($mysp + 4) end end set $prevsp = $mysp set $mysp = * $mysp end printf "\n\t\tstackbottom=0x%08x", $prevsp else printf "\n\t\t\tcontinuation=" output /a $kgm_thread.continuation end printf "\n" else printf "\n" end end end define showact showactheader showactint $arg0 0 end document showact | Routine to print out the state of a specific thread. | The following is the syntax: | (gdb) showact end define showactstack showactheader showactint $arg0 1 end document showactstack | Routine to print out the stack of a specific thread. | The following is the syntax: | (gdb) showactstack end define showallthreads set $kgm_head_taskp = &default_pset.tasks set $kgm_taskp = (struct task *)($kgm_head_taskp->next) while $kgm_taskp != $kgm_head_taskp showtaskheader showtaskint $kgm_taskp showactheader set $kgm_head_actp = &($kgm_taskp->threads) set $kgm_actp = (struct thread *)($kgm_taskp->threads.next) while $kgm_actp != $kgm_head_actp showactint $kgm_actp 0 set $kgm_actp = (struct thread *)($kgm_actp->task_threads.next) end printf "\n" set $kgm_taskp = (struct task *)($kgm_taskp->pset_tasks.next) end end document showallthreads | Routine to print out info about all threads in the system. | The following is the syntax: | (gdb) showallthreads end define showcurrentthreads set $kgm_ncpus = machine_info.max_cpus set $kgm_i = 0 while $kgm_i < $kgm_ncpus set $kgm_prp = processor_ptr[$kgm_i] if ($kgm_prp != 0) && (($kgm_prp)->active_thread != 0) set $kgm_actp = (($kgm_prp)->active_thread)->top_act showtaskheader showtaskint ($kgm_actp)->task showactheader showactint $kgm_actp 0 printf "\n" end set $kgm_i = $kgm_i + 1 end end document showcurrentthreads | Routine to print out info about the thread running on each cpu. | The following is the syntax: | (gdb) showcurrentthreads end define showallstacks set $kgm_head_taskp = &default_pset.tasks set $kgm_taskp = (struct task *)($kgm_head_taskp->next) while $kgm_taskp != $kgm_head_taskp showtaskheader showtaskint $kgm_taskp set $kgm_head_actp = &($kgm_taskp->threads) set $kgm_actp = (struct thread *)($kgm_taskp->threads.next) while $kgm_actp != $kgm_head_actp showactheader showactint $kgm_actp 1 set $kgm_actp = (struct thread *)($kgm_actp->task_threads.next) end printf "\n" set $kgm_taskp = (struct task *)($kgm_taskp->pset_tasks.next) end end document showallstacks | Routine to print out the stack for each thread in the system. | The following is the syntax: | (gdb) showallstacks end define showcurrentstacks set $kgm_ncpus = machine_info.max_cpus set $kgm_i = 0 while $kgm_i < $kgm_ncpus set $kgm_prp = processor_ptr[$kgm_i] if ($kgm_prp != 0) && (($kgm_prp)->active_thread != 0) set $kgm_actp = (($kgm_prp)->active_thread)->top_act showtaskheader showtaskint ($kgm_actp)->task showactheader showactint $kgm_actp 1 printf "\n" end set $kgm_i = $kgm_i + 1 end end document showcurrentstacks | Routine to print out the thread running on each cpu (incl. its stack) | The following is the syntax: | (gdb) showcurrentstacks end define showwaiterheader printf "waiters activation " printf "thread pri state wait_queue wait_event\n" end define showwaitqwaiters set $kgm_w_waitqp = (struct wait_queue *)$arg0 set $kgm_w_linksp = &($kgm_w_waitqp->wq_queue) set $kgm_w_wqe = (struct wait_queue_element *)$kgm_w_linksp->next set $kgm_w_found = 0 while ( (queue_entry_t)$kgm_w_wqe != (queue_entry_t)$kgm_w_linksp) if ($kgm_w_wqe->wqe_type != &_wait_queue_link) if !$kgm_w_found set $kgm_w_found = 1 showwaiterheader end set $kgm_w_shuttle = (struct thread *)$kgm_w_wqe showactint $kgm_w_shuttle->top_act 0 end set $kgm_w_wqe = (struct wait_queue_element *)$kgm_w_wqe->wqe_links.next end end define showwaitqwaitercount set $kgm_wc_waitqp = (struct wait_queue *)$arg0 set $kgm_wc_linksp = &($kgm_wc_waitqp->wq_queue) set $kgm_wc_wqe = (struct wait_queue_element *)$kgm_wc_linksp->next set $kgm_wc_count = 0 while ( (queue_entry_t)$kgm_wc_wqe != (queue_entry_t)$kgm_wc_linksp) if ($kgm_wc_wqe->wqe_type != &_wait_queue_link) set $kgm_wc_count = $kgm_wc_count + 1 end set $kgm_wc_wqe = (struct wait_queue_element *)$kgm_wc_wqe->wqe_links.next end printf "0x%08x ", $kgm_wc_count end define showwaitqmembercount set $kgm_mc_waitqsetp = (struct wait_queue_set *)$arg0 set $kgm_mc_setlinksp = &($kgm_mc_waitqsetp->wqs_setlinks) set $kgm_mc_wql = (struct wait_queue_link *)$kgm_mc_setlinksp->next set $kgm_mc_count = 0 while ( (queue_entry_t)$kgm_mc_wql != (queue_entry_t)$kgm_mc_setlinksp) set $kgm_mc_count = $kgm_mc_count + 1 set $kgm_mc_wql = (struct wait_queue_link *)$kgm_mc_wql->wql_setlinks.next end printf "0x%08x ", $kgm_mc_count end define showwaitqmemberheader printf "set-members wait_queue interlock " printf "pol type member_cnt waiter_cnt\n" end define showwaitqmemberint set $kgm_m_waitqp = (struct wait_queue *)$arg0 printf " 0x%08x ", $kgm_m_waitqp printf "0x%08x ", $kgm_m_waitqp->wq_interlock.lock_data if ($kgm_m_waitqp->wq_fifo) printf "Fifo " else printf "Prio " end if ($kgm_m_waitqp->wq_type == 0xf1d1) printf "Set " showwaitqmembercount $kgm_m_waitqp else printf "Que 0x00000000 " end showwaitqwaitercount $kgm_m_waitqp printf "\n" end define showwaitqmemberofheader printf "member-of wait_queue interlock " printf "pol type member_cnt waiter_cnt\n" end define showwaitqmemberof set $kgm_mo_waitqp = (struct wait_queue *)$arg0 set $kgm_mo_linksp = &($kgm_mo_waitqp->wq_queue) set $kgm_mo_wqe = (struct wait_queue_element *)$kgm_mo_linksp->next set $kgm_mo_found = 0 while ( (queue_entry_t)$kgm_mo_wqe != (queue_entry_t)$kgm_mo_linksp) if ($kgm_mo_wqe->wqe_type == &_wait_queue_link) if !$kgm_mo_found set $kgm_mo_found = 1 showwaitqmemberofheader end set $kgm_mo_wqlp = (struct wait_queue_link *)$kgm_mo_wqe set $kgm_mo_wqsetp = (struct wait_queue *)($kgm_mo_wqlp->wql_setqueue) showwaitqmemberint $kgm_mo_wqsetp end set $kgm_mo_wqe = (struct wait_queue_element *)$kgm_mo_wqe->wqe_links.next end end define showwaitqmembers set $kgm_ms_waitqsetp = (struct wait_queue_set *)$arg0 set $kgm_ms_setlinksp = &($kgm_ms_waitqsetp->wqs_setlinks) set $kgm_ms_wql = (struct wait_queue_link *)$kgm_ms_setlinksp->next set $kgm_ms_found = 0 while ( (queue_entry_t)$kgm_ms_wql != (queue_entry_t)$kgm_ms_setlinksp) set $kgm_ms_waitqp = $kgm_ms_wql->wql_element.wqe_queue if !$kgm_ms_found showwaitqmemberheader set $kgm_ms_found = 1 end showwaitqmemberint $kgm_ms_waitqp set $kgm_ms_wql = (struct wait_queue_link *)$kgm_ms_wql->wql_setlinks.next end end define showwaitqheader printf "wait_queue ref_count interlock " printf "pol type member_cnt waiter_cnt\n" end define showwaitqint set $kgm_waitqp = (struct wait_queue *)$arg0 printf "0x%08x ", $kgm_waitqp if ($kgm_waitqp->wq_type == 0xf1d1) printf "0x%08x ", ((struct wait_queue_set *)$kgm_waitqp)->wqs_refcount else printf "0x00000000 " end printf "0x%08x ", $kgm_waitqp->wq_interlock.lock_data if ($kgm_waitqp->wq_fifo) printf "Fifo " else printf "Prio " end if ($kgm_waitqp->wq_type == 0xf1d1) printf "Set " showwaitqmembercount $kgm_waitqp else printf "Que 0x00000000 " end showwaitqwaitercount $kgm_waitqp printf "\n" end define showwaitq set $kgm_waitq1p = (wait_queue_t)$arg0 showwaitqheader showwaitqint $kgm_waitq1p if ($kgm_waitq1p->wq_type == 0xf1d1) showwaitqmembers $kgm_waitq1p else showwaitqmemberof $kgm_waitq1p end showwaitqwaiters $kgm_waitq1p end define showmapheader printf "vm_map pmap vm_size " printf "#ents rpage hint first_free\n" end define showvmeheader printf " entry start " printf "prot #page object offset\n" end define showvmint set $kgm_mapp = (vm_map_t)$arg0 set $kgm_map = *$kgm_mapp printf "0x%08x ", $arg0 printf "0x%08x ", $kgm_map.pmap printf "0x%08x ", $kgm_map.size printf "%3d ", $kgm_map.hdr.nentries printf "%5d ", $kgm_map.pmap->stats.resident_count printf "0x%08x ", $kgm_map.hint printf "0x%08x\n", $kgm_map.first_free if $arg1 != 0 showvmeheader set $kgm_head_vmep = &($kgm_mapp->hdr.links) set $kgm_vmep = $kgm_map.hdr.links.next while (($kgm_vmep != 0) && ($kgm_vmep != $kgm_head_vmep)) set $kgm_vme = *$kgm_vmep printf " 0x%08x ", $kgm_vmep printf "0x%08x ", $kgm_vme.links.start printf "%1x", $kgm_vme.protection printf "%1x", $kgm_vme.max_protection if $kgm_vme.inheritance == 0x0 printf "S" end if $kgm_vme.inheritance == 0x1 printf "C" end if $kgm_vme.inheritance == 0x2 printf "-" end if $kgm_vme.inheritance == 0x3 printf "D" end if $kgm_vme.is_sub_map printf "s " else if $kgm_vme.needs_copy printf "n " else printf " " end end printf "%5d ",($kgm_vme.links.end - $kgm_vme.links.start) >> 12 printf "0x%08x ", $kgm_vme.object.vm_object printf "0x%08x\n", $kgm_vme.offset set $kgm_vmep = $kgm_vme.links.next end end printf "\n" end define showmapvme showmapheader showvmint $arg0 1 end document showmapvme | Routine to print out a summary listing of all the entries in a vm_map | The following is the syntax: | (gdb) showmapvme end define showmap showmapheader showvmint $arg0 0 end document showmap | Routine to print out info about the specified vm_map | The following is the syntax: | (gdb) showmap end define showallvm set $kgm_head_taskp = &default_pset.tasks set $kgm_taskp = (struct task *)($kgm_head_taskp->next) while $kgm_taskp != $kgm_head_taskp showtaskheader showmapheader showtaskint $kgm_taskp showvmint $kgm_taskp->map 0 set $kgm_taskp = (struct task *)($kgm_taskp->pset_tasks.next) end end document showallvm | Routine to print a summary listing of all the vm maps | The following is the syntax: | (gdb) showallvm end define showallvme set $kgm_head_taskp = &default_pset.tasks set $kgm_taskp = (struct task *)($kgm_head_taskp->next) while $kgm_taskp != $kgm_head_taskp showtaskheader showmapheader showtaskint $kgm_taskp showvmint $kgm_taskp->map 1 set $kgm_taskp = (struct task *)($kgm_taskp->pset_tasks.next) end end document showallvme | Routine to print a summary listing of all the vm map entries | The following is the syntax: | (gdb) showallvme end define showipcheader printf "ipc_space is_table table_next " printf "flags tsize splaytree splaybase\n" end define showipceheader printf " name object " printf "rite urefs destname destination\n" end define showipceint set $kgm_ie = *(ipc_entry_t)$arg0 printf " 0x%08x ", $arg1 printf "0x%08x ", $kgm_ie.ie_object if $kgm_ie.ie_bits & 0x00100000 printf "Dead " printf "%5d\n", $kgm_ie.ie_bits & 0xffff else if $kgm_ie.ie_bits & 0x00080000 printf "SET " printf "%5d\n", $kgm_ie.ie_bits & 0xffff else if $kgm_ie.ie_bits & 0x00010000 if $kgm_ie.ie_bits & 0x00020000 printf " SR" else printf " S" end else if $kgm_ie.ie_bits & 0x00020000 printf " R" end end if $kgm_ie.ie_bits & 0x00040000 printf " O" end if $kgm_ie.index.request printf "n" else printf " " end if $kgm_ie.ie_bits & 0x00800000 printf "c" else printf " " end printf "%5d ", $kgm_ie.ie_bits & 0xffff showportdest $kgm_ie.ie_object end end end define showipcint set $kgm_isp = (ipc_space_t)$arg0 set $kgm_is = *$kgm_isp printf "0x%08x ", $arg0 printf "0x%08x ", $kgm_is.is_table printf "0x%08x ", $kgm_is.is_table_next if $kgm_is.is_growing != 0 printf "G" else printf " " end if $kgm_is.is_fast != 0 printf "F" else printf " " end if $kgm_is.is_active != 0 printf "A " else printf " " end printf "%5d ", $kgm_is.is_table_size printf "0x%08x ", $kgm_is.is_tree_total printf "0x%08x\n", &$kgm_isp->is_tree if $arg1 != 0 showipceheader set $kgm_iindex = 0 set $kgm_iep = $kgm_is.is_table set $kgm_destspacep = (ipc_space_t)0 while ( $kgm_iindex < $kgm_is.is_table_size ) set $kgm_ie = *$kgm_iep if $kgm_ie.ie_bits & 0x001f0000 set $kgm_name = (($kgm_iindex << 8)|($kgm_ie.ie_bits >> 24)) showipceint $kgm_iep $kgm_name end set $kgm_iindex = $kgm_iindex + 1 set $kgm_iep = &($kgm_is.is_table[$kgm_iindex]) end if $kgm_is.is_tree_total printf "Still need to write tree traversal\n" end end printf "\n" end define showipc set $kgm_isp = (ipc_space_t)$arg0 showipcheader showipcint $kgm_isp 0 end document showipc | Routine to print the status of the specified ipc space | The following is the syntax: | (gdb) showipc end define showrights set $kgm_isp = (ipc_space_t)$arg0 showipcheader showipcint $kgm_isp 1 end document showrights | Routine to print a summary list of all the rights in a specified ipc space | The following is the syntax: | (gdb) showrights end define showtaskipc set $kgm_taskp = (task_t)$arg0 showtaskheader showipcheader showtaskint $kgm_taskp showipcint $kgm_taskp->itk_space 0 end document showtaskipc | Routine to print info about the ipc space for a task | The following is the syntax: | (gdb) showtaskipc end define showtaskrights set $kgm_taskp = (task_t)$arg0 showtaskheader showipcheader showtaskint $kgm_taskp showipcint $kgm_taskp->itk_space 1 end document showtaskrights | Routine to print info about the ipc rights for a task | The following is the syntax: | (gdb) showtaskrights end define showallipc set $kgm_head_taskp = &default_pset.tasks set $kgm_taskp = (struct task *)($kgm_head_taskp->next) while $kgm_taskp != $kgm_head_taskp showtaskheader showipcheader showtaskint $kgm_taskp showipcint $kgm_taskp->itk_space 0 set $kgm_taskp = (struct task *)($kgm_taskp->pset_tasks.next) end end document showallipc | Routine to print a summary listing of all the ipc spaces | The following is the syntax: | (gdb) showallipc end define showallrights set $kgm_head_taskp = &default_pset.tasks set $kgm_taskp = (struct task *)($kgm_head_taskp->next) while $kgm_taskp != $kgm_head_taskp showtaskheader showipcheader showtaskint $kgm_taskp showipcint $kgm_taskp->itk_space 1 set $kgm_taskp = (struct task *)($kgm_taskp->pset_tasks.next) end end document showallrights | Routine to print a summary listing of all the ipc rights | The following is the syntax: | (gdb) showallrights end define showtaskvm set $kgm_taskp = (task_t)$arg0 showtaskheader showmapheader showtaskint $kgm_taskp showvmint $kgm_taskp->map 0 end document showtaskvm | Routine to print out info about a task's vm_map | The following is the syntax: | (gdb) showtaskvm end define showtaskvme set $kgm_taskp = (task_t)$arg0 showtaskheader showmapheader showtaskint $kgm_taskp showvmint $kgm_taskp->map 1 end document showtaskvme | Routine to print out info about a task's vm_map_entries | The following is the syntax: | (gdb) showtaskvme end define showtaskheader printf "task vm_map ipc_space #acts " showprocheader end define showtaskint set $kgm_task = *(struct task *)$arg0 printf "0x%08x ", $arg0 printf "0x%08x ", $kgm_task.map printf "0x%08x ", $kgm_task.itk_space printf "%3d ", $kgm_task.thread_count showprocint $kgm_task.bsd_info end define showtask showtaskheader showtaskint $arg0 end document showtask | Routine to print out info about a task. | The following is the syntax: | (gdb) showtask end define showtaskthreads showtaskheader set $kgm_taskp = (struct task *)$arg0 showtaskint $kgm_taskp showactheader set $kgm_head_actp = &($kgm_taskp->threads) set $kgm_actp = (struct thread *)($kgm_taskp->threads.next) while $kgm_actp != $kgm_head_actp showactint $kgm_actp 0 set $kgm_actp = (struct thread *)($kgm_actp->task_threads.next) end end document showtaskthreads | Routine to print info about the threads in a task. | The following is the syntax: | (gdb) showtaskthreads end define showtaskstacks showtaskheader set $kgm_taskp = (struct task *)$arg0 showtaskint $kgm_taskp set $kgm_head_actp = &($kgm_taskp->threads) set $kgm_actp = (struct thread *)($kgm_taskp->threads.next) while $kgm_actp != $kgm_head_actp showactheader showactint $kgm_actp 1 set $kgm_actp = (struct thread *)($kgm_actp->task_threads.next) end end document showtaskstacks | Routine to print out the stack for each thread in a task. | The following is the syntax: | (gdb) showtaskstacks end define showalltasks showtaskheader set $kgm_head_taskp = &default_pset.tasks set $kgm_taskp = (struct task *)($kgm_head_taskp->next) while $kgm_taskp != $kgm_head_taskp showtaskint $kgm_taskp set $kgm_taskp = (struct task *)($kgm_taskp->pset_tasks.next) end end document showalltasks | Routine to print a summary listing of all the tasks | The following is the syntax: | (gdb) showalltasks end define showprocheader printf " pid proc command\n" end define showprocint set $kgm_procp = (struct proc *)$arg0 if $kgm_procp != 0 printf "%5d ", $kgm_procp->p_pid printf "0x%08x ", $kgm_procp printf "%s\n", $kgm_procp->p_comm else printf " *0* 0x00000000 --\n" end end define showpid showtaskheader set $kgm_head_taskp = &default_pset.tasks set $kgm_taskp = (struct task *)($kgm_head_taskp->next) while $kgm_taskp != $kgm_head_taskp set $kgm_procp = (struct proc *)$kgm_taskp->bsd_info if (($kgm_procp != 0) && ($kgm_procp->p_pid == $arg0)) showtaskint $kgm_taskp set $kgm_taskp = $kgm_head_taskp else set $kgm_taskp = (struct task *)($kgm_taskp->pset_tasks.next) end end end document showpid | Routine to print a single process by pid | The following is the syntax: | (gdb) showpid end define showproc showtaskheader set $kgm_procp = (struct proc *)$arg0 showtaskint $kgm_procp->task $arg1 $arg2 end define kdb set switch_debugger=1 continue end document kdb | kdb - Switch to the inline kernel debugger | | usage: kdb | | The kdb macro allows you to invoke the inline kernel debugger. end define showpsetheader printf "portset waitqueue recvname " printf "flags refs recvname process\n" end define showportheader printf "port mqueue recvname " printf "flags refs recvname process\n" end define showportmemberheader printf "members port recvname " printf "flags refs mqueue msgcount\n" end define showkmsgheader printf "messages kmsg size " printf "disp msgid remote-port local-port\n" end define showkmsgint printf " 0x%08x ", $arg0 set $kgm_kmsgh = ((ipc_kmsg_t)$arg0)->ikm_header printf "0x%08x ", $kgm_kmsgh.msgh_size if (($kgm_kmsgh.msgh_bits & 0xff) == 19) printf "rC" else printf "rM" end if (($kgm_kmsgh.msgh_bits & 0xff00) == (19 < 8)) printf "lC" else printf "lM" end if ($kgm_kmsgh.msgh_bits & 0xf0000000) printf "c" else printf "s" end printf "%5d ", $kgm_kmsgh.msgh_id printf "0x%08x ", $kgm_kmsgh.msgh_remote_port printf "0x%08x\n", $kgm_kmsgh.msgh_local_port end define showkobject set $kgm_portp = (struct ipc_port *)$arg0 printf "0x%08x kobject(", $kgm_portp->ip_kobject set $kgm_kotype = ($kgm_portp->ip_object.io_bits & 0x00000fff) if ($kgm_kotype == 1) printf "THREAD" end if ($kgm_kotype == 2) printf "TASK" end if ($kgm_kotype == 3) printf "HOST" end if ($kgm_kotype == 4) printf "HOST_PRIV" end if ($kgm_kotype == 5) printf "PROCESSOR" end if ($kgm_kotype == 6) printf "PSET" end if ($kgm_kotype == 7) printf "PSET_NAME" end if ($kgm_kotype == 8) printf "TIMER" end if ($kgm_kotype == 9) printf "PAGER_REQ" end if ($kgm_kotype == 10) printf "DEVICE" end if ($kgm_kotype == 11) printf "XMM_OBJECT" end if ($kgm_kotype == 12) printf "XMM_PAGER" end if ($kgm_kotype == 13) printf "XMM_KERNEL" end if ($kgm_kotype == 14) printf "XMM_REPLY" end if ($kgm_kotype == 15) printf "NOTDEF 15" end if ($kgm_kotype == 16) printf "NOTDEF 16" end if ($kgm_kotype == 17) printf "HOST_SEC" end if ($kgm_kotype == 18) printf "LEDGER" end if ($kgm_kotype == 19) printf "MASTER_DEV" end if ($kgm_kotype == 20) printf "ACTIVATION" end if ($kgm_kotype == 21) printf "SUBSYSTEM" end if ($kgm_kotype == 22) printf "IO_DONE_QUE" end if ($kgm_kotype == 23) printf "SEMAPHORE" end if ($kgm_kotype == 24) printf "LOCK_SET" end if ($kgm_kotype == 25) printf "CLOCK" end if ($kgm_kotype == 26) printf "CLOCK_CTRL" end if ($kgm_kotype == 27) printf "IOKIT_SPARE" end if ($kgm_kotype == 28) printf "NAMED_MEM" end if ($kgm_kotype == 29) printf "IOKIT_CON" end if ($kgm_kotype == 30) printf "IOKIT_OBJ" end if ($kgm_kotype == 31) printf "UPL" end printf ")\n" end define showportdestproc set $kgm_portp = (struct ipc_port *)$arg0 set $kgm_spacep = $kgm_portp->data.receiver # check against the previous cached value - this is slow if ($kgm_spacep != $kgm_destspacep) set $kgm_destprocp = (struct proc *)0 set $kgm_head_taskp = &default_pset.tasks set $kgm_taskp = (struct task *)($kgm_head_taskp->next) while (($kgm_destprocp == 0) && ($kgm_taskp != $kgm_head_taskp)) set $kgm_destspacep = $kgm_taskp->itk_space if ($kgm_destspacep == $kgm_spacep) set $kgm_destprocp = (struct proc *)$kgm_taskp->bsd_info else set $kgm_taskp = (struct task *)($kgm_taskp->pset_tasks.next) end end end if $kgm_destprocp != 0 printf "%s(%d)\n", $kgm_destprocp->p_comm, $kgm_destprocp->p_pid else printf "task 0x%08x\n", $kgm_taskp end end define showportdest set $kgm_portp = (struct ipc_port *)$arg0 set $kgm_spacep = $kgm_portp->data.receiver if ($kgm_spacep == ipc_space_kernel) showkobject $kgm_portp else if ($kgm_portp->ip_object.io_bits & 0x80000000) printf "0x%08x ", $kgm_portp->ip_object.io_receiver_name showportdestproc $kgm_portp else printf "0x%08x inactive-port\n", $kgm_portp end end end define showportmember printf " 0x%08x ", $arg0 set $kgm_portp = (struct ipc_port *)$arg0 printf "0x%08x ", $kgm_portp->ip_object.io_receiver_name if ($kgm_portp->ip_object.io_bits & 0x80000000) printf "A" else printf " " end if ($kgm_portp->ip_object.io_bits & 0x7fff0000) printf "Set " else printf "Port" end printf "%5d ", $kgm_portp->ip_object.io_references printf "0x%08x ", &($kgm_portp->ip_messages) printf "0x%08x\n", $kgm_portp->ip_messages.data.port.msgcount end define showportint printf "0x%08x ", $arg0 set $kgm_portp = (struct ipc_port *)$arg0 printf "0x%08x ", &($kgm_portp->ip_messages) printf "0x%08x ", $kgm_portp->ip_object.io_receiver_name if ($kgm_portp->ip_object.io_bits & 0x80000000) printf "A" else printf "D" end printf "Port" printf "%5d ", $kgm_portp->ip_object.io_references set $kgm_destspacep = (struct ipc_space *)0 showportdest $kgm_portp set $kgm_kmsgp = (ipc_kmsg_t)$kgm_portp->ip_messages.data.port.messages.ikmq_base if $arg1 && $kgm_kmsgp showkmsgheader showkmsgint $kgm_kmsgp set $kgm_kmsgheadp = $kgm_kmsgp set $kgm_kmsgp = $kgm_kmsgp->ikm_next while $kgm_kmsgp != $kgm_kmsgheadp showkmsgint $kgm_kmsgp set $kgm_kmsgp = $kgm_kmsgp->ikm_next end end end define showpsetint printf "0x%08x ", $arg0 set $kgm_psetp = (struct ipc_pset *)$arg0 printf "0x%08x ", &($kgm_psetp->ips_messages) printf "0x%08x ", $kgm_psetp->ips_object.io_receiver_name if ($kgm_psetp->ips_object.io_bits & 0x80000000) printf "A" else printf "D" end printf "Set " printf "%5d ", $kgm_psetp->ips_object.io_references printf "0x%08x ", $kgm_psetp->ips_object.io_receiver_name set $kgm_setlinksp = &($kgm_psetp->ips_messages.data.set_queue.wqs_setlinks) set $kgm_wql = (struct wait_queue_link *)$kgm_setlinksp->next set $kgm_found = 0 while ( (queue_entry_t)$kgm_wql != (queue_entry_t)$kgm_setlinksp) set $kgm_portp = (struct ipc_port *)((int)($kgm_wql->wql_element->wqe_queue) - ((int)$kgm_portoff)) if !$kgm_found set $kgm_destspacep = (struct ipc_space *)0 showportdestproc $kgm_portp showportmemberheader set $kgm_found = 1 end showportmember $kgm_portp 0 set $kgm_wql = (struct wait_queue_link *)$kgm_wql->wql_setlinks.next end if !$kgm_found printf "--n/e--\n" end end define showpset showpsetheader showpsetint $arg0 1 end define showport showportheader showportint $arg0 1 end define showipcobject set $kgm_object = (ipc_object_t)$arg0 if ($kgm_objectp->io_bits & 0x7fff0000) showpset $kgm_objectp else showport $kgm_objectp end end define showmqueue set $kgm_mqueue = *(struct ipc_mqueue *)$arg0 set $kgm_psetoff = &(((struct ipc_pset *)0)->ips_messages) set $kgm_portoff = &(((struct ipc_port *)0)->ip_messages) if ($kgm_mqueue.data.set_queue.wqs_wait_queue.wq_type == 0xf1d1) set $kgm_pset = (((int)$arg0) - ((int)$kgm_psetoff)) showpsetheader showpsetint $kgm_pset 1 end if ($kgm_mqueue.data.set_queue.wqs_wait_queue.wq_type == 0xf1d0) showportheader set $kgm_port = (((int)$arg0) - ((int)$kgm_portoff)) showportint $kgm_port 1 end end define zprint_one set $kgm_zone = (struct zone *)$arg0 printf "0x%08x ", $kgm_zone printf "%8d ",$kgm_zone->count printf "%8x ",$kgm_zone->cur_size printf "%8x ",$kgm_zone->max_size printf "%6d ",$kgm_zone->elem_size printf "%8x ",$kgm_zone->alloc_size printf "%s ",$kgm_zone->zone_name if ($kgm_zone->exhaustible) printf "H" end if ($kgm_zone->collectable) printf "C" end if ($kgm_zone->expandable) printf "X" end printf "\n" end define zprint printf "ZONE COUNT TOT_SZ MAX_SZ ELT_SZ ALLOC_SZ NAME\n" set $kgm_zone_ptr = (struct zone *)first_zone while ($kgm_zone_ptr != 0) zprint_one $kgm_zone_ptr set $kgm_zone_ptr = $kgm_zone_ptr->next_zone end printf "\n" end document zprint | Routine to print a summary listing of all the kernel zones | The following is the syntax: | (gdb) zprint end set $kdp_act_counter = 0 define switchtoact if (machine_slot[0].cpu_type == 18) if ($kdp_act_counter == 0) set $kdpstate = (struct savearea *) kdp.saved_state end set $kdp_act_counter = $kdp_act_counter + 1 set $newact = (struct thread *) $arg0 if (($newact.thread)->kernel_stack == 0) echo This activation does not have a stack.\n echo continuation: output/a $newact.thread.continuation echo \n end set (struct savearea *) kdp.saved_state=$newact->mact->pcb flush set $pc=$newact->mact->pcb.save_srr0 update else echo switchtoact not implemented for this architecture.\n end end document switchtoact Syntax: switchtoact
| This command allows gdb to examine the execution context and call | stack for the specified activation. For example, to view the backtrace | for an activation issue "switchtoact
", followed by "bt". | Before resuming execution, issue a "resetctx" command, to | return to the original execution context. end define switchtoctx if (machine_slot[0].cpu_type == 18) if ($kdp_act_counter == 0) set $kdpstate = (struct savearea *) kdp.saved_state end set $kdp_act_counter = $kdp_act_counter + 1 set (struct savearea *) kdp.saved_state=(struct savearea *) $arg0 flush set $pc=((struct savearea *) $arg0)->save_srr0 update else echo switchtoctx not implemented for this architecture.\n end end document switchtoctx Syntax: switchtoctx
| This command allows gdb to examine an execution context and dump the | backtrace for this execution context. | Before resuming execution, issue a "resetctx" command, to | return to the original execution context. end define resetctx if (machine_slot[0].cpu_type == 18) set (struct savearea *)kdp.saved_state=$kdpstate flush set $pc=((struct savearea *) kdp.saved_state)->save_srr0 update set $kdp_act_counter = 0 else echo resetctx not implemented for this architecture.\n end end document resetctx | Syntax: resetctx | Returns to the original execution context. This command should be | issued if you wish to resume execution after using the "switchtoact" | or "switchtoctx" commands. end define resume_on set noresume_on_disconnect = 0 end document resume_on | Syntax: resume_on | The target system will resume when detaching or exiting from gdb. | This is the default behavior. end define resume_off set noresume_on_disconnect = 1 end document resume_off | Syntax: resume_off | The target system won't resume after detaching from gdb and | can be attached with a new gdb session end define paniclog set $kgm_panic_bufptr = debug_buf set $kgm_panic_bufptr_max = debug_buf_ptr while $kgm_panic_bufptr < $kgm_panic_bufptr_max if *(char *)$kgm_panic_bufptr == 10 printf "\n" else printf "%c", *$kgm_panic_bufptr end set $kgm_panic_bufptr= (char *)$kgm_panic_bufptr + 1 end end document paniclog | Syntax: paniclog | Display the panic log information | end define dumpcallqueue set $kgm_callhead = (queue_t)&$arg0 set $kgm_call = (struct call_entry *)$kgm_callhead.next set $kgm_i = 0 while $kgm_call != $kgm_callhead printf "0x%08x ", $kgm_call printf "0x%08x 0x%08x ", $kgm_call->param0, $kgm_call->param1 output $kgm_call->state printf "\t" output $kgm_call->deadline printf "\t" output $kgm_call->func printf "\n" set $kgm_i = $kgm_i + 1 set $kgm_call = (struct call_entry *)$kgm_call->q_link.next end printf "%d entries\n", $kgm_i end document dumpcallqueue | Syntax: dumpcallqueue | Displays the contents of the specified call_entry queue. end define showtaskacts showtaskthreads $arg0 end document showtaskacts | See help showtaskthreads. end define showallacts showallthreads end document showallacts | See help showallthreads. end