]> git.saurik.com Git - apple/xnu.git/blob - osfmk/.gdbinit
xnu-123.5.tar.gz
[apple/xnu.git] / osfmk / .gdbinit
1 #
2 # Kernel gdb macros
3 #
4 # These gdb macros should be useful during kernel development in
5 # determining what's going on in the kernel.
6 #
7 # All the convenience variables used by these macros begin with $kgm_
8
9 set $kgm_vers = 2
10
11 echo Loading Kernel GDB Macros package. Type "help kgm" for more info.\n
12
13 define kgm
14 printf "These are the kernel gdb macros version %d. ", $kgm_vers
15 echo Type "help kgm" for more info.\n
16 end
17
18 document kgm
19 | These are the kernel gdb macros. These gdb macros are intended to be
20 | used when debugging a remote kernel via the kdp protocol. Typically, you
21 | would connect to your remote target like so:
22 | (gdb) target remote-kdp
23 | (gdb) attach <name-of-remote-host>
24 |
25 | The following macros are available in this package:
26 |
27 | showalltasks Display a summary listing of tasks
28 | showallacts Display a summary listing of all activations
29 | showallstacks Display the kernel stacks for all activations
30 | showallvm Display a summary listing of all the vm maps
31 | showallvme Display a summary listing of all the vm map entries
32 | showallipc Display a summary listing of all the ipc spaces
33 | showallrights Display a summary listing of all the ipc rights
34 | showallkmods Display a summary listing of all the kernel modules
35 |
36 | showtask Display status of the specified task
37 | showtaskacts Display the status of all activations in the task
38 | showtaskstacks Display all kernel stacks for all activations in the task
39 | showtaskvm Display status of the specified task's vm_map
40 | showtaskvme Display a summary list of the task's vm_map entries
41 | showtaskipc Display status of the specified task's ipc space
42 | showtaskrights Display a summary list of the task's ipc space entries
43 |
44 | showact Display status of the specified thread activation
45 | showactstack Display the kernel stack for the specified activation
46 |
47 | showmap Display the status of the specified vm_map
48 | showmapvme Display a summary list of the specified vm_map's entries
49 |
50 | showipc Display the status of the specified ipc space
51 | showrights Display a summary list of all the rights in an ipc space
52 |
53 | showpid Display the status of the process identified by pid
54 | showproc Display the status of the process identified by a proc pointer
55 |
56 | showkmod Display information about a kernel module
57 | showkmodaddr Given an address, display the kernel module and offset
58 |
59 | zprint Display zone information
60 |
61 | Type "help <macro>" for more specific help on a particular macro.
62 | Type "show user <macro>" to see what the macro is really doing.
63 end
64
65
66 define showkmodheader
67 printf "kmod address size "
68 printf "id refs version name\n"
69 end
70
71 define showkmodint
72 set $kgm_kmodp = (struct kmod_info *)$arg0
73 printf "0x%08x ", $arg0
74 printf "0x%08x ", $kgm_kmodp->address
75 printf "0x%08x ", $kgm_kmodp->size
76 printf "%3d ", $kgm_kmodp->id
77 printf "%5d ", $kgm_kmodp->reference_count
78 printf "%10s ", &$kgm_kmodp->version
79 printf "%s\n", &$kgm_kmodp->name
80 end
81
82 set $kgm_kmodmin = 0xffffffff
83 set $kgm_fkmodmin = 0x00000000
84 set $kgm_kmodmax = 0x00000000
85 set $kgm_fkmodmax = 0xffffffff
86 set $kgm_pkmod = 0
87 set $kgm_pkmodst = 0
88 set $kgm_pkmoden = 0
89 define showkmodaddr
90 printf "0x%x" , $arg0
91 if ((unsigned int)$arg0 >= (unsigned int)$kgm_pkmodst) && ((unsigned int)$arg0 <= (unsigned int)$kgm_pkmoden)
92 set $kgm_off = ((unsigned int)$arg0 - (unsigned int)$kgm_pkmodst)
93 printf " <%s + 0x%x>", $kgm_pkmod->name, $kgm_off
94 else
95 if ((unsigned int)$arg0 <= (unsigned int)$kgm_fkmodmax) && ((unsigned int)$arg0 >= (unsigned int)$kgm_fkmodmin)
96 set $kgm_kmodp = (struct kmod_info *)kmod
97 while $kgm_kmodp
98 set $kgm_kmod = *$kgm_kmodp
99 if $kgm_kmod.address && ($kgm_kmod.address < $kgm_kmodmin)
100 set $kgm_kmodmin = $kgm_kmod.address
101 end
102 if ($kgm_kmod.address + $kgm_kmod.size) > $kgm_kmodmax
103 set $kgm_kmodmax = $kgm_kmod.address
104 end
105 set $kgm_off = ((unsigned int)$arg0 - (unsigned int)$kgm_kmod.address)
106 if ($kgm_kmod.address <= $arg0) && ($kgm_off <= $kgm_kmod.size)
107 printf " <%s + 0x%x>", $kgm_kmodp->name, $kgm_off
108 set $kgm_pkmod = $kgm_kmodp
109 set $kgm_pkmodst = $kgm_kmod.address
110 set $kgm_pkmoden = $kgm_pkmodst + $kgm_kmod.size
111 set $kgm_kmodp = 0
112 else
113 set $kgm_kmodp = $kgm_kmod.next
114 end
115 end
116 if !$kgm_pkmod
117 set $kgm_fkmodmin = $kgm_kmodmin
118 set $kgm_fkmodmax = $kgm_kmodmax
119 end
120 end
121 end
122 end
123 document showkmodaddr
124 | Given an address, print the offset and name for the kmod containing it
125 | The following is the syntax:
126 | (gdb) showkmodaddr <addr>
127 end
128
129 define showkmod
130 showkmodheader
131 showkmodint $arg0
132 end
133 document showkmod
134 | Routine to print info about a kernel module
135 | The following is the syntax:
136 | (gdb) showkmod <kmod>
137 end
138
139 define showallkmods
140 showkmodheader
141 set $kgm_kmodp = (struct kmod_info *)kmod
142 while $kgm_kmodp
143 showkmodint $kgm_kmodp
144 set $kgm_kmodp = $kgm_kmodp->next
145 end
146 end
147 document showallkmods
148 | Routine to print a summary listing of all the kernel modules
149 | The following is the syntax:
150 | (gdb) showallkmods
151 end
152
153 define showactheader
154 printf " activation "
155 printf "thread pri state wait_queue wait_event\n"
156 end
157
158
159 define showactint
160 printf " 0x%08x ", $arg0
161 set $kgm_actp = *(Thread_Activation *)$arg0
162 if $kgm_actp.thread
163 set $kgm_thread = *$kgm_actp.thread
164 printf "0x%08x ", $kgm_actp.thread
165 printf "%3d ", $kgm_thread.sched_pri
166 set $kgm_state = $kgm_thread.state
167 if $kgm_state & 0x80
168 printf "I"
169 end
170 if $kgm_state & 0x40
171 printf "P"
172 end
173 if $kgm_state & 0x20
174 printf "A"
175 end
176 if $kgm_state & 0x10
177 printf "H"
178 end
179 if $kgm_state & 0x08
180 printf "U"
181 end
182 if $kgm_state & 0x04
183 printf "R"
184 end
185 if $kgm_state & 0x02
186 printf "S"
187 end
188 if $kgm_state & 0x01
189 printf "W\t"
190 printf "0x%08x ", $kgm_thread.wait_queue
191 output /a $kgm_thread.wait_event
192 end
193 if $arg1 != 0
194 if ($kgm_thread.kernel_stack != 0)
195 if ($kgm_thread.stack_privilege != 0)
196 printf "\n\t\tstack_privilege=0x%08x", $kgm_thread.stack_privilege
197 end
198 printf "\n\t\tkernel_stack=0x%08x", $kgm_thread.kernel_stack
199 set $mysp = $kgm_actp->mact.pcb.ss.r1
200 set $prevsp = 0
201 printf "\n\t\tstacktop=0x%08x", $mysp
202 while ($mysp != 0) && (($mysp & 0xf) == 0) && ($mysp < 0xb0000000) && ($mysp > $prevsp)
203 printf "\n\t\t0x%08x ", $mysp
204 set $kgm_return = *($mysp + 8)
205 if ($kgm_return > end)
206 showkmodaddr $kgm_return
207 else
208 output /a * ($mysp + 8)
209 end
210 set $prevsp = $mysp
211 set $mysp = * $mysp
212 end
213 printf "\n\t\tstackbottom=0x%08x", $prevsp
214 else
215 printf "\n\t\t\tcontinuation="
216 output /a $kgm_thread.continuation
217 end
218 printf "\n"
219 else
220 printf "\n"
221 end
222 end
223 end
224
225 define showact
226 showactheader
227 showactint $arg0 0
228 end
229 document showact
230 | Routine to print out the state of a specific thread activation.
231 | The following is the syntax:
232 | (gdb) showact <activation>
233 end
234
235
236 define showactstack
237 showactheader
238 showactint $arg0 1
239 end
240 document showactstack
241 | Routine to print out the stack of a specific thread activation.
242 | The following is the syntax:
243 | (gdb) showactstack <activation>
244 end
245
246
247 define showallacts
248 set $kgm_head_taskp = &default_pset.tasks
249 set $kgm_taskp = (Task *)($kgm_head_taskp->next)
250 while $kgm_taskp != $kgm_head_taskp
251 showtaskheader
252 showtaskint $kgm_taskp
253 showactheader
254 set $kgm_head_actp = &($kgm_taskp->thr_acts)
255 set $kgm_actp = (Thread_Activation *)($kgm_taskp->thr_acts.next)
256 while $kgm_actp != $kgm_head_actp
257 showactint $kgm_actp 0
258 set $kgm_actp = (Thread_Activation *)($kgm_actp->thr_acts.next)
259 end
260 printf "\n"
261 set $kgm_taskp = (Task *)($kgm_taskp->pset_tasks.next)
262 end
263 end
264 document showallacts
265 | Routine to print out a summary listing of all the thread activations.
266 | The following is the syntax:
267 | (gdb) showallacts
268 end
269
270
271 define showallstacks
272 set $kgm_head_taskp = &default_pset.tasks
273 set $kgm_taskp = (Task *)($kgm_head_taskp->next)
274 while $kgm_taskp != $kgm_head_taskp
275 showtaskheader
276 showtaskint $kgm_taskp
277 set $kgm_head_actp = &($kgm_taskp->thr_acts)
278 set $kgm_actp = (Thread_Activation *)($kgm_taskp->thr_acts.next)
279 while $kgm_actp != $kgm_head_actp
280 showactheader
281 showactint $kgm_actp 1
282 set $kgm_actp = (Thread_Activation *)($kgm_actp->thr_acts.next)
283 end
284 printf "\n"
285 set $kgm_taskp = (Task *)($kgm_taskp->pset_tasks.next)
286 end
287 end
288 document showallstacks
289 | Routine to print out a summary listing of all the thread kernel stacks.
290 | The following is the syntax:
291 | (gdb) showallstacks
292 end
293
294 define showwaitqmembercount
295 set $kgm_waitqsubp = (wait_queue_sub_t)$arg0
296 set $kgm_sublinksp = &($kgm_waitqsubp->wqs_sublinks)
297 set $kgm_wql = (wait_queue_link_t)$kgm_sublinksp->next
298 set $kgm_count = 0
299 while ( (queue_entry_t)$kgm_wql != (queue_entry_t)$kgm_sublinksp)
300 set $kgm_waitqp = $kgm_wql->wql_element->wqe_queue
301 if !$kgm_found
302 showwaitqmemberheader
303 set $kgm_found = 1
304 end
305 showwaitqmemberint $kgm_waitqp
306 end
307 end
308
309
310 define showwaitqmemberint
311 set $kgm_waitqp = (wait_queue_t)$arg0
312 printf " 0x%08x ", $kgm_waitqp
313 printf "0x%08x ", $kgm_waitqp->wq_interlock
314 if ($kgm_waitqp->wq_fifo)
315 printf "Fifo"
316 else
317 printf "Prio"
318 end
319 if ($kgm_waitqp->wq_issub)
320 printf "S"
321 else
322 printf " "
323 end
324 printf " "
325 showwaitqwaitercount $kgm_waitqp
326 showwaitqmembercount $kgm_waitqp
327 printf "\n"
328 end
329
330
331 define showwaitqmembers
332 set $kgm_waitqsubp = (wait_queue_sub_t)$arg0
333 set $kgm_sublinksp = &($kgm_waitqsubp->wqs_sublinks)
334 set $kgm_wql = (wait_queue_link_t)$kgm_sublinksp->next
335 set $kgm_found = 0
336 while ( (queue_entry_t)$kgm_wql != (queue_entry_t)$kgm_sublinksp)
337 set $kgm_waitqp = $kgm_wql->wql_element->wqe_queue
338 if !$kgm_found
339 showwaitqmemberheader
340 set $kgm_found = 1
341 end
342 showwaitqmemberint $kgm_waitqp
343 end
344 end
345
346 define showwaitq
347 set $kgm_waitq = (wait_queue_t)$arg0
348 showwaitqheader
349 showwaitqwaiters
350 if ($kgm_waitq->wq_issub)
351 showwaitqmembers
352 end
353 end
354
355 define showmapheader
356 printf "vm_map pmap vm_size "
357 printf "#ents rpage hint first_free\n"
358 end
359
360 define showvmeheader
361 printf " entry start "
362 printf "prot #page object offset\n"
363 end
364
365 define showvmint
366 set $kgm_mapp = (vm_map_t)$arg0
367 set $kgm_map = *$kgm_mapp
368 printf "0x%08x ", $arg0
369 printf "0x%08x ", $kgm_map.pmap
370 printf "0x%08x ", $kgm_map.size
371 printf "%3d ", $kgm_map.hdr.nentries
372 printf "%5d ", $kgm_map.pmap->stats.resident_count
373 printf "0x%08x ", $kgm_map.hint
374 printf "0x%08x\n", $kgm_map.first_free
375 if $arg1 != 0
376 showvmeheader
377 set $kgm_head_vmep = &($kgm_mapp->hdr.links)
378 set $kgm_vmep = $kgm_map.hdr.links.next
379 while (($kgm_vmep != 0) && ($kgm_vmep != $kgm_head_vmep))
380 set $kgm_vme = *$kgm_vmep
381 printf " 0x%08x ", $kgm_vmep
382 printf "0x%08x ", $kgm_vme.links.start
383 printf "%1x", $kgm_vme.protection
384 printf "%1x", $kgm_vme.max_protection
385 if $kgm_vme.inheritance == 0x0
386 printf "S"
387 end
388 if $kgm_vme.inheritance == 0x1
389 printf "C"
390 end
391 if $kgm_vme.inheritance == 0x2
392 printf "-"
393 end
394 if $kgm_vme.inheritance == 0x3
395 printf "D"
396 end
397 if $kgm_vme.is_sub_map
398 printf "s "
399 else
400 if $kgm_vme.needs_copy
401 printf "n "
402 else
403 printf " "
404 end
405 end
406 printf "%5d ",($kgm_vme.links.end - $kgm_vme.links.start) >> 12
407 printf "0x%08x ", $kgm_vme.object.vm_object
408 printf "0x%08x\n", $kgm_vme.offset
409 set $kgm_vmep = $kgm_vme.links.next
410 end
411 end
412 printf "\n"
413 end
414
415
416 define showmapvme
417 showmapheader
418 showvmint $arg0 1
419 end
420 document showmapvme
421 | Routine to print out a summary listing of all the entries in a vm_map
422 | The following is the syntax:
423 | (gdb) showmapvme <vm_map>
424 end
425
426
427 define showmap
428 showmapheader
429 showvmint $arg0 0
430 end
431 document showmap
432 | Routine to print out a summary description of a vm_map
433 | The following is the syntax:
434 | (gdb) showmap <vm_map>
435 end
436
437 define showallvm
438 set $kgm_head_taskp = &default_pset.tasks
439 set $kgm_taskp = (Task *)($kgm_head_taskp->next)
440 while $kgm_taskp != $kgm_head_taskp
441 showtaskheader
442 showmapheader
443 showtaskint $kgm_taskp
444 showvmint $kgm_taskp->map 0
445 set $kgm_taskp = (Task *)($kgm_taskp->pset_tasks.next)
446 end
447 end
448 document showallvm
449 | Routine to print a summary listing of all the vm maps
450 | The following is the syntax:
451 | (gdb) showallvm
452 end
453
454
455 define showallvme
456 set $kgm_head_taskp = &default_pset.tasks
457 set $kgm_taskp = (Task *)($kgm_head_taskp->next)
458 while $kgm_taskp != $kgm_head_taskp
459 showtaskheader
460 showmapheader
461 showtaskint $kgm_taskp
462 showvmint $kgm_taskp->map 1
463 set $kgm_taskp = (Task *)($kgm_taskp->pset_tasks.next)
464 end
465 end
466 document showallvme
467 | Routine to print a summary listing of all the vm map entries
468 | The following is the syntax:
469 | (gdb) showallvme
470 end
471
472
473 define showipcheader
474 printf "ipc_space is_table table_next "
475 printf "flags tsize splaytree splaybase\n"
476 end
477
478 define showipceheader
479 printf " name object "
480 printf "rite urefs destname destination\n"
481 end
482
483 define showipceint
484 set $kgm_ie = *(ipc_entry_t)$arg0
485 printf " 0x%08x ", $arg1
486 printf "0x%08x ", $kgm_ie.ie_object
487 if $kgm_ie.ie_bits & 0x00100000
488 printf "Dead "
489 printf "%5d\n", $kgm_ie.ie_bits & 0xffff
490 else
491 if $kgm_ie.ie_bits & 0x00080000
492 printf "SET "
493 printf "%5d\n", $kgm_ie.ie_bits & 0xffff
494 else
495 if $kgm_ie.ie_bits & 0x00010000
496 if $kgm_ie.ie_bits & 0x00020000
497 printf " SR"
498 else
499 printf " S"
500 end
501 else
502 if $kgm_ie.ie_bits & 0x00020000
503 printf " R"
504 end
505 end
506 if $kgm_ie.ie_bits & 0x00040000
507 printf " O"
508 end
509 if $kgm_ie.index.request
510 printf "n"
511 else
512 printf " "
513 end
514 if $kgm_ie.ie_bits & 0x00800000
515 printf "c"
516 else
517 printf " "
518 end
519 printf "%5d ", $kgm_ie.ie_bits & 0xffff
520 showportdest $kgm_ie.ie_object
521 end
522 end
523 end
524
525 define showipcint
526 set $kgm_isp = (ipc_space_t)$arg0
527 set $kgm_is = *$kgm_isp
528 printf "0x%08x ", $arg0
529 printf "0x%08x ", $kgm_is.is_table
530 printf "0x%08x ", $kgm_is.is_table_next
531 if $kgm_is.is_growing != 0
532 printf "G"
533 else
534 printf " "
535 end
536 if $kgm_is.is_fast != 0
537 printf "F"
538 else
539 printf " "
540 end
541 if $kgm_is.is_active != 0
542 printf "A "
543 else
544 printf " "
545 end
546 printf "%5d ", $kgm_is.is_table_size
547 printf "0x%08x ", $kgm_is.is_tree_total
548 printf "0x%08x\n", &$kgm_isp->is_tree
549 if $arg1 != 0
550 showipceheader
551 set $kgm_iindex = 0
552 set $kgm_iep = $kgm_is.is_table
553 set $kgm_destspacep = (ipc_space_t)0
554 while ( $kgm_iindex < $kgm_is.is_table_size )
555 set $kgm_ie = *$kgm_iep
556 if $kgm_ie.ie_bits & 0x001f0000
557 set $kgm_name = (($kgm_iindex << 8)|($kgm_ie.ie_bits >> 24))
558 showipceint $kgm_iep $kgm_name
559 end
560 set $kgm_iindex = $kgm_iindex + 1
561 set $kgm_iep = &($kgm_is.is_table[$kgm_iindex])
562 end
563 if $kgm_is.is_tree_total
564 printf "Still need to write tree traversal\n"
565 end
566 end
567 printf "\n"
568 end
569
570
571 define showipc
572 set $kgm_isp = (ipc_space_t)$arg0
573 showipcheader
574 showipcint $kgm_isp 0
575 end
576 document showipc
577 | Routine to print the status of the specified ipc space
578 | The following is the syntax:
579 | (gdb) showipc <ipc_space>
580 end
581
582 define showrights
583 set $kgm_isp = (ipc_space_t)$arg0
584 showipcheader
585 showipcint $kgm_isp 1
586 end
587 document showrights
588 | Routine to print a summary list of all the rights in a specified ipc space
589 | The following is the syntax:
590 | (gdb) showrights <ipc_space>
591 end
592
593
594 define showtaskipc
595 set $kgm_taskp = (task_t)$arg0
596 showtaskheader
597 showipcheader
598 showtaskint $kgm_taskp
599 showipcint $kgm_taskp->itk_space 0
600 end
601 document showtaskipc
602 | Routine to print the status of the ipc space for a task
603 | The following is the syntax:
604 | (gdb) showtaskipc <task>
605 end
606
607
608 define showtaskrights
609 set $kgm_taskp = (task_t)$arg0
610 showtaskheader
611 showipcheader
612 showtaskint $kgm_taskp
613 showipcint $kgm_taskp->itk_space 1
614 end
615 document showtaskrights
616 | Routine to print a summary listing of all the ipc rights for a task
617 | The following is the syntax:
618 | (gdb) showtaskrights <task>
619 end
620
621 define showallipc
622 set $kgm_head_taskp = &default_pset.tasks
623 set $kgm_taskp = (Task *)($kgm_head_taskp->next)
624 while $kgm_taskp != $kgm_head_taskp
625 showtaskheader
626 showipcheader
627 showtaskint $kgm_taskp
628 showipcint $kgm_taskp->itk_space 0
629 set $kgm_taskp = (Task *)($kgm_taskp->pset_tasks.next)
630 end
631 end
632 document showallipc
633 | Routine to print a summary listing of all the ipc spaces
634 | The following is the syntax:
635 | (gdb) showallipc
636 end
637
638
639 define showallrights
640 set $kgm_head_taskp = &default_pset.tasks
641 set $kgm_taskp = (Task *)($kgm_head_taskp->next)
642 while $kgm_taskp != $kgm_head_taskp
643 showtaskheader
644 showipcheader
645 showtaskint $kgm_taskp
646 showipcint $kgm_taskp->itk_space 1
647 set $kgm_taskp = (Task *)($kgm_taskp->pset_tasks.next)
648 end
649 end
650 document showallrights
651 | Routine to print a summary listing of all the ipc rights
652 | The following is the syntax:
653 | (gdb) showallrights
654 end
655
656
657 define showtaskvm
658 set $kgm_taskp = (task_t)$arg0
659 showtaskheader
660 showmapheader
661 showtaskint $kgm_taskp
662 showvmint $kgm_taskp->map 0
663 end
664 document showtaskvm
665 | Routine to print out a summary description of a task's vm_map
666 | The following is the syntax:
667 | (gdb) showtaskvm <task>
668 end
669
670 define showtaskvme
671 set $kgm_taskp = (task_t)$arg0
672 showtaskheader
673 showmapheader
674 showtaskint $kgm_taskp
675 showvmint $kgm_taskp->map 1
676 end
677 document showtaskvme
678 | Routine to print out a summary listing of a task's vm_map_entries
679 | The following is the syntax:
680 | (gdb) showtaskvme <task>
681 end
682
683
684 define showtaskheader
685 printf "task vm_map ipc_space #acts "
686 showprocheader
687 end
688
689
690 define showtaskint
691 set $kgm_task = *(Task *)$arg0
692 printf "0x%08x ", $arg0
693 printf "0x%08x ", $kgm_task.map
694 printf "0x%08x ", $kgm_task.itk_space
695 printf "%3d ", $kgm_task.thr_act_count
696 showprocint $kgm_task.bsd_info
697 end
698
699 define showtask
700 showtaskheader
701 showtaskint $arg0
702 end
703 document showtask
704 | Routine to print out info about a task.
705 | The following is the syntax:
706 | (gdb) showtask <task>
707 end
708
709
710 define showtaskacts
711 showtaskheader
712 set $kgm_taskp = (Task *)$arg0
713 showtaskint $kgm_taskp
714 showactheader
715 set $kgm_head_actp = &($kgm_taskp->thr_acts)
716 set $kgm_actp = (Thread_Activation *)($kgm_taskp->thr_acts.next)
717 while $kgm_actp != $kgm_head_actp
718 showactint $kgm_actp 0
719 set $kgm_actp = (Thread_Activation *)($kgm_actp->thr_acts.next)
720 end
721 end
722 document showtaskacts
723 | Routine to print a summary listing of the activations in a task
724 | The following is the syntax:
725 | (gdb) showtaskacts <task>
726 end
727
728
729 define showtaskstacks
730 showtaskheader
731 set $kgm_taskp = (Task *)$arg0
732 showtaskint $kgm_taskp
733 set $kgm_head_actp = &($kgm_taskp->thr_acts)
734 set $kgm_actp = (Thread_Activation *)($kgm_taskp->thr_acts.next)
735 while $kgm_actp != $kgm_head_actp
736 showactheader
737 showactint $kgm_actp 1
738 set $kgm_actp = (Thread_Activation *)($kgm_actp->thr_acts.next)
739 end
740 end
741 document showtaskstacks
742 | Routine to print a summary listing of the activations in a task and their stacks
743 | The following is the syntax:
744 | (gdb) showtaskstacks <task>
745 end
746
747
748 define showalltasks
749 showtaskheader
750 set $kgm_head_taskp = &default_pset.tasks
751 set $kgm_taskp = (Task *)($kgm_head_taskp->next)
752 while $kgm_taskp != $kgm_head_taskp
753 showtaskint $kgm_taskp
754 set $kgm_taskp = (Task *)($kgm_taskp->pset_tasks.next)
755 end
756 end
757 document showalltasks
758 | Routine to print a summary listing of all the tasks
759 | The following is the syntax:
760 | (gdb) showalltasks
761 end
762
763
764 define showprocheader
765 printf " pid proc command\n"
766 end
767
768 define showprocint
769 set $kgm_procp = (struct proc *)$arg0
770 if $kgm_procp != 0
771 printf "%5d ", $kgm_procp->p_pid
772 printf "0x%08x ", $kgm_procp
773 printf "%s\n", $kgm_procp->p_comm
774 else
775 printf " *0* 0x00000000 --\n"
776 end
777 end
778
779 define showpid
780 showtaskheader
781 set $kgm_head_taskp = &default_pset.tasks
782 set $kgm_taskp = (Task *)($kgm_head_taskp->next)
783 while $kgm_taskp != $kgm_head_taskp
784 set $kgm_procp = (struct proc *)$kgm_taskp->bsd_info
785 if (($kgm_procp != 0) && ($kgm_procp->p_pid == $arg0))
786 showtaskint $kgm_taskp
787 set $kgm_taskp = $kgm_head_taskp
788 else
789 set $kgm_taskp = (Task *)($kgm_taskp->pset_tasks.next)
790 end
791 end
792 end
793 document showpid
794 | Routine to print a single process by pid
795 | The following is the syntax:
796 | (gdb) showpid <pid>
797 end
798
799 define showproc
800 showtaskheader
801 set $kgm_procp = (struct proc *)$arg0
802 showtaskint $kgm_procp->task $arg1 $arg2
803 end
804
805
806 define kdb
807 set switch_debugger=1
808 continue
809 end
810 document kdb
811 | kdb - Switch to the inline kernel debugger
812 |
813 | usage: kdb
814 |
815 | The kdb macro allows you to invoke the inline kernel debugger.
816 end
817
818 define showpsetheader
819 printf "portset waitqueue recvname "
820 printf "flags refs recvname process\n"
821 end
822
823 define showportheader
824 printf "port mqueue recvname "
825 printf "flags refs recvname process\n"
826 end
827
828 define showportmemberheader
829 printf " port recvname "
830 printf "flags refs mqueue msgcount\n"
831 end
832
833 define showkmsgheader
834 printf " kmsg size "
835 printf "disp msgid remote-port local-port\n"
836 end
837
838 define showkmsgint
839 printf " 0x%08x ", $arg0
840 set $kgm_kmsgh = ((ipc_kmsg_t)$arg0)->ikm_header
841 printf "0x%08x ", $kgm_kmsgh.msgh_size
842 if (($kgm_kmsgh.msgh_bits & 0xff) == 19)
843 printf "rC"
844 else
845 printf "rM"
846 end
847 if (($kgm_kmsgh.msgh_bits & 0xff00) == (19 < 8))
848 printf "lC"
849 else
850 printf "lM"
851 end
852 if ($kgm_kmsgh.msgh_bits & 0xf0000000)
853 printf "c"
854 else
855 printf "s"
856 end
857 printf "%5d ", $kgm_kmsgh.msgh_msgid
858 printf "0x%08x ", $kgm_kmsgh.msgh_remote_port
859 printf "0x%08x\n", $kgm_kmsgh.msgh_local_port
860 end
861
862
863
864 define showkobject
865 set $kgm_portp = (ipc_port_t)$arg0
866 printf "0x%08x kobject(", $kgm_portp->ip_kobject
867 set $kgm_kotype = ($kgm_portp->ip_object.io_bits & 0x00000fff)
868 if ($kgm_kotype == 1)
869 printf "THREAD"
870 end
871 if ($kgm_kotype == 2)
872 printf "TASK"
873 end
874 if ($kgm_kotype == 3)
875 printf "HOST"
876 end
877 if ($kgm_kotype == 4)
878 printf "HOST_PRIV"
879 end
880 if ($kgm_kotype == 5)
881 printf "PROCESSOR"
882 end
883 if ($kgm_kotype == 6)
884 printf "PSET"
885 end
886 if ($kgm_kotype == 7)
887 printf "PSET_NAME"
888 end
889 if ($kgm_kotype == 8)
890 printf "TIMER"
891 end
892 if ($kgm_kotype == 9)
893 printf "PAGER_REQ"
894 end
895 if ($kgm_kotype == 10)
896 printf "DEVICE"
897 end
898 if ($kgm_kotype == 11)
899 printf "XMM_OBJECT"
900 end
901 if ($kgm_kotype == 12)
902 printf "XMM_PAGER"
903 end
904 if ($kgm_kotype == 13)
905 printf "XMM_KERNEL"
906 end
907 if ($kgm_kotype == 14)
908 printf "XMM_REPLY"
909 end
910 if ($kgm_kotype == 15)
911 printf "NOTDEF 15"
912 end
913 if ($kgm_kotype == 16)
914 printf "NOTDEF 16"
915 end
916 if ($kgm_kotype == 17)
917 printf "HOST_SEC"
918 end
919 if ($kgm_kotype == 18)
920 printf "LEDGER"
921 end
922 if ($kgm_kotype == 19)
923 printf "MASTER_DEV"
924 end
925 if ($kgm_kotype == 20)
926 printf "ACTIVATION"
927 end
928 if ($kgm_kotype == 21)
929 printf "SUBSYSTEM"
930 end
931 if ($kgm_kotype == 22)
932 printf "IO_DONE_QUE"
933 end
934 if ($kgm_kotype == 23)
935 printf "SEMAPHORE"
936 end
937 if ($kgm_kotype == 24)
938 printf "LOCK_SET"
939 end
940 if ($kgm_kotype == 25)
941 printf "CLOCK"
942 end
943 if ($kgm_kotype == 26)
944 printf "CLOCK_CTRL"
945 end
946 if ($kgm_kotype == 27)
947 printf "IOKIT_SPARE"
948 end
949 if ($kgm_kotype == 28)
950 printf "NAMED_MEM"
951 end
952 if ($kgm_kotype == 29)
953 printf "IOKIT_CON"
954 end
955 if ($kgm_kotype == 30)
956 printf "IOKIT_OBJ"
957 end
958 if ($kgm_kotype == 31)
959 printf "UPL"
960 end
961 printf ")\n"
962 end
963
964 define showportdestproc
965 set $kgm_portp = (ipc_port_t)$arg0
966 set $kgm_spacep = $kgm_portp->data.receiver
967 # check against the previous cached value - this is slow
968 if ($kgm_spacep != $kgm_destspacep)
969 set $kgm_destprocp = (struct proc *)0
970 set $kgm_head_taskp = &default_pset.tasks
971 set $kgm_taskp = (Task *)($kgm_head_taskp->next)
972 while (($kgm_destprocp == 0) && ($kgm_taskp != $kgm_head_taskp))
973 set $kgm_destspacep = $kgm_taskp->itk_space
974 if ($kgm_destspacep == $kgm_spacep)
975 set $kgm_destprocp = (struct proc *)$kgm_taskp->bsd_info
976 else
977 set $kgm_taskp = (Task *)($kgm_taskp->pset_tasks.next)
978 end
979 end
980 end
981 if $kgm_destprocp != 0
982 printf "%s(%d)\n", $kgm_destprocp->p_comm, $kgm_destprocp->p_pid
983 else
984 printf "task 0x%08x\n", $kgm_taskp
985 end
986 end
987
988 define showportdest
989 set $kgm_portp = (ipc_port_t)$arg0
990 set $kgm_spacep = $kgm_portp->data.receiver
991 if ($kgm_spacep == ipc_space_kernel)
992 showkobject $kgm_portp
993 else
994 if ($kgm_portp->ip_object.io_bits & 0x80000000)
995 printf "0x%08x ", $kgm_portp->ip_object.io_receiver_name
996 showportdestproc $kgm_portp
997 else
998 printf "0x%08x inactive-port\n", $kgm_portp
999 end
1000 end
1001 end
1002
1003 define showportmember
1004 printf " 0x%08x ", $arg0
1005 set $kgm_portp = (ipc_port_t)$arg0
1006 printf "0x%08x ", $kgm_portp->ip_object.io_receiver_name
1007 if ($kgm_portp->ip_object.io_bits & 0x80000000)
1008 printf "A"
1009 else
1010 printf " "
1011 end
1012 if ($kgm_portp->ip_object.io_bits & 0x7fff0000)
1013 printf "Set "
1014 else
1015 printf "Port"
1016 end
1017 printf "%5d ", $kgm_portp->ip_object.io_references
1018 printf "0x%08x ", &($kgm_portp->ip_messages)
1019 printf "0x%08x\n", $kgm_portp->ip_messages.data.port.msgcount
1020 end
1021
1022 define showportint
1023 printf "0x%08x ", $arg0
1024 set $kgm_portp = (ipc_port_t)$arg0
1025 printf "0x%08x ", &($kgm_portp->ip_messages)
1026 printf "0x%08x ", $kgm_portp->ip_object.io_receiver_name
1027 if ($kgm_portp->ip_object.io_bits & 0x80000000)
1028 printf "A"
1029 else
1030 printf "D"
1031 end
1032 printf "Port"
1033 printf "%5d ", $kgm_portp->ip_object.io_references
1034 set $kgm_destspacep = (ipc_space_t)0
1035 showportdest $kgm_portp
1036 set $kgm_kmsgp = (ipc_kmsg_t)$kgm_portp->ip_messages.data.port.messages.ikmq_base
1037 if $arg1 && $kgm_kmsgp
1038 showkmsgheader
1039 showkmsgint $kgm_kmsgp
1040 set $kgm_kmsgheadp = $kgm_kmsgp
1041 set $kgm_kmsgp = $kgm_kmsgp->ikm_next
1042 while $kgm_kmsgp != $kgm_kmsgheadp
1043 showkmsgint $kgm_kmsgp
1044 set $kgm_kmsgp = $kgm_kmsgp->ikm_next
1045 end
1046 end
1047 end
1048
1049 define showpsetint
1050 printf "0x%08x ", $arg0
1051 set $kgm_psetp = (ipc_pset_t)$arg0
1052 printf "0x%08x ", &($kgm_psetp->ips_messages)
1053 printf "0x%08x ", $kgm_psetp->ips_object.io_receiver_name
1054 if ($kgm_psetp->ips_object.io_bits & 0x80000000)
1055 printf "A"
1056 else
1057 printf "D"
1058 end
1059 printf "Set "
1060 printf "%5d ", $kgm_psetp->ips_object.io_references
1061 set $kgm_sublinksp = &($kgm_psetp->ips_messages.data.set_queue.wqs_sublinks)
1062 set $kgm_wql = (wait_queue_link_t)$kgm_sublinksp->next
1063 set $kgm_found = 0
1064 while ( (queue_entry_t)$kgm_wql != (queue_entry_t)$kgm_sublinksp)
1065 set $kgm_portp = (ipc_port_t)((int)($kgm_wql->wql_element->wqe_queue) - ((int)$kgm_portoff))
1066 if !$kgm_found
1067 set $kgm_destspacep = (ipc_space_t)0
1068 showportdest $kgm_portp
1069 showportmemberheader
1070 set $kgm_found = 1
1071 end
1072 showportmember $kgm_portp 0
1073 set $kgm_wql = (wait_queue_link_t)$kgm_wql->wql_sublinks.next
1074 end
1075 if !$kgm_found
1076 printf "--n/e-- --n/e--\n"
1077 end
1078 end
1079
1080 define showpset
1081 showpsetheader
1082 showpsetint $arg0 1
1083 end
1084
1085 define showport
1086 showportheader
1087 showportint $arg0 1
1088 end
1089
1090 define showipcobject
1091 set $kgm_object = (ipc_object_t)$arg0
1092 if ($kgm_objectp->io_bits & 0x7fff0000)
1093 showpset $kgm_objectp
1094 else
1095 showport $kgm_objectp
1096 end
1097 end
1098
1099 define showmqueue
1100 set $kgm_mqueue = *(ipc_mqueue_t)$arg0
1101 set $kgm_psetoff = &(((ipc_pset_t)0)->ips_messages)
1102 set $kgm_portoff = &(((ipc_port_t)0)->ip_messages)
1103 if ($kgm_mqueue.data.set_queue.wqs_wait_queue.wq_issub)
1104 set $kgm_pset = (((int)$arg0) - ((int)$kgm_psetoff))
1105 showpsetheader
1106 showpsetint $kgm_pset 1
1107 else
1108 showportheader
1109 set $kgm_port = (((int)$arg0) - ((int)$kgm_portoff))
1110 showportint $kgm_port 1
1111 end
1112 end
1113
1114 define zprint_one
1115 set $kgm_zone = (struct zone *)$arg0
1116
1117 printf "0x%08x ", $kgm_zone
1118 printf "%8d ",$kgm_zone->count
1119 printf "%8x ",$kgm_zone->cur_size
1120 printf "%8x ",$kgm_zone->max_size
1121 printf "%6d ",$kgm_zone->elem_size
1122 printf "%8x ",$kgm_zone->alloc_size
1123 printf "%s ",$kgm_zone->zone_name
1124
1125 if ($kgm_zone->exhaustible)
1126 printf "H"
1127 end
1128 if ($kgm_zone->collectable)
1129 printf "C"
1130 end
1131 if ($kgm_zone->expandable)
1132 printf "X"
1133 end
1134 printf "\n"
1135 end
1136
1137
1138 define zprint
1139 printf "ZONE COUNT TOT_SZ MAX_SZ ELT_SZ ALLOC_SZ NAME\n"
1140 set $kgm_zone_ptr = (struct zone *)first_zone
1141 while ($kgm_zone_ptr != 0)
1142 zprint_one $kgm_zone_ptr
1143 set $kgm_zone_ptr = $kgm_zone_ptr->next_zone
1144 end
1145 printf "\n"
1146 end
1147 document zprint
1148 | Routine to print a summary listing of all the kernel zones
1149 | The following is the syntax:
1150 | (gdb) zprint
1151 end
1152