|
|
1.1 root 1: ##
2: # Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3: #
4: # @APPLE_LICENSE_HEADER_START@
5: #
6: # Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
7: # Reserved. This file contains Original Code and/or Modifications of
8: # Original Code as defined in and that are subject to the Apple Public
9: # Source License Version 1.1 (the "License"). You may not use this file
10: # except in compliance with the License. Please obtain a copy of the
11: # License at http://www.apple.com/publicsource and read it before using
12: # this file.
13: #
14: # The Original Code and all software distributed under the License are
15: # distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16: # EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17: # INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18: # FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
19: # License for the specific language governing rights and limitations
20: # under the License.
21: #
22: # @APPLE_LICENSE_HEADER_END@
23: ##
24:
25: #
26: # .gdbinit for kernel debugging
27: #
28: # Created and Maintained by :
29: # Umesh Vaishampayan ([email protected])
30: #
31: # Contributions from:
32: # Conrad Minshall ([email protected])
33: # Eryk Vershen, Tom Mason
34: #
35:
36: # Set prettyprinting of structures
37: set print pretty
38: # Set printing of unions interior to structures
39: set print union
40:
41: # Unlimited page size.
42: set height 0
43:
44: #
45: # Macros to print stacktrace on PPC
46: # Typical usage :
47: # kstack <thread-addr>
48: # tstack
49: # tstack
50: # ...
51: #
52: # For the active_thread(), following would be slightly faster
53: # ststack
54: # tstack
55: # tstack
56: # ....
57: #
58: define kstack
59: set $s=(thread_t)$arg0
60: if (($s->kernel_stack) == 0)
61: echo "no kernel stack\n"
62: else
63: if $arg0 == cpu_data->active_thread
64: ststack
65: else
66: set $f=((struct ppc_kernel_state *)(($s->kernel_stack)+0x3f94))->r1
67: p/x $f
68: x/i ((struct ppc_kernel_state *)(($s->kernel_stack)+0x3f94))->lr
69: end
70: end
71: end
72: document kstack
73: Start a stack backtrace for the thread passed in as first argument
74: must be called before calling 'tstack'
75: (for PPC only)
76: end
77:
78: define ststack
79: set $f=(long*)*$r1
80: p/x $f
81: x/i *($f+2)-4
82: end
83: document ststack
84: Start a stack backtrace for the active_thread()
85: must be called before calling 'tstack'
86: (for PPC only)
87: end
88:
89: define tstack
90: if (*(long*)$f) != 0
91: set $f=*(long*)$f
92: p/x $f
93: x/i *($f+8)-4
94: else
95: echo end of stack\n
96: end
97: end
98: document tstack
99: Print top of the stack and pop a frame
100: must be called after 'kstack' or 'ststack'
101: (for PPC only)
102: end
103:
104: #
105: # Other stack related macros
106: #
107:
108: define tsaved
109: p/x *(struct ppc_saved_state *)($f+0x90)
110: end
111: document tsaved
112: Print the saved state for the current frame.
113: must be used after 'tstack' or 'kstack' or ststack'.
114: end
115:
116: #
117: # Macros to print addresses as various structures
118: #
119: define pcb
120: p *(pcb_t)$arg0
121: end
122: document pcb
123: Print first argument as a pcb_t.
124: end
125:
126: define pth
127: p *(thread_t)$arg0
128: end
129: document pth
130: Print first argument as a thread_t.
131: end
132:
133: define pswapf
134: p *((thread_t)$arg0)->swap_func
135: end
136: document pswapf
137: Print the swap_func of a thread
138: end
139:
140: define pta
141: p *(task_t)$arg0
142: end
143: document pta
144: Print first argument as a task_t.
145: end
146:
147: define dmapent
148: echo " map_entry"
149: p $arg0
150: echo " start "
151: p ((vm_map_entry_t)$arg0)->links.start
152: echo " end "
153: p ((vm_map_entry_t)$arg0)->links.end
154: if ( $arg0->is_a_map != 0)
155: echo " object is a map"\n
156: echo " share"
157: p $arg0->object.share_map
158: echo " offset"
159: p $arg0->offset
160: end
161: if ( $arg0->is_shared != 0)
162: echo " region is shared"\n
163: end
164: if ( $arg0->is_sub_map != 0)
165: echo " object is a sub map"\n
166: end
167: if ( $arg0->copy_on_write != 0)
168: echo " data is copy on write"\n
169: end
170: if ( $arg0->in_transition != 0)
171: echo " Entry is being changed"\n
172: end
173: if ( $arg0->needs_wakeup != 0)
174: echo " Waiters on in_transition"\n
175: end
176: if ( $arg0->needs_copy != 0)
177: echo " object needs to be copied"\n
178: end
179: echo " protection "
180: p ((vm_map_entry_t)$arg0)->protection
181: echo " max protection "
182: p ((vm_map_entry_t)$arg0)->max_protection
183: echo " inheritance "
184: p ((vm_map_entry_t)$arg0)->inheritance
185: echo " wired count "
186: p ((vm_map_entry_t)$arg0)->wired_count
187: echo " user_wired_count "
188: p ((vm_map_entry_t)$arg0)->user_wired_count
189: end
190: document dmapent
191: Pretty print the first argument as a vm_map_entry_t.
192: end
193:
194: define dmap
195: set $vmmapptr=$arg0
196: set $iter=0
197: if (((vm_map_t)$vmmapptr)->is_main_map != 0)
198: echo " this is a main map"\n
199: end
200: echo " start "
201: p ((vm_map_t)$vmmapptr)->hdr.links.start
202: echo " end "
203: p ((vm_map_t)$vmmapptr)->hdr.links.end
204: if ((vm_map_t)$vmmapptr->entries_pageable != 0)
205: echo " map entries are pageable"\n
206: else
207: echo " map entries are NOT pageable"\n
208: end
209: echo " size "
210: p ((vm_map_t)$vmmapptr)->size
211: echo " pmap "
212: p ((vm_map_t)$vmmapptr)->pmap
213: set $mapentptr=$vmmapptr->hdr.links.next
214: echo " number of map entries "
215: p ((vm_map_t)$vmmapptr)->hdr.nentries
216: while ($iter < ((vm_map_t)$arg0)->hdr.nentries)
217: echo \n
218: echo " entry "
219: p $iter
220: dmapent $mapentptr
221: set $mapentptr=((vm_map_entry_t)$mapentptr)->links.next
222: set $iter=$iter+1
223: end
224: end
225: document dmap
226: Pretty print the first argument as a vm_map_t.
227: end
228:
229: #
230: # List all the tasks.
231: # Print interesting information in the following order :
232: # Name of the task [task->proc->p_comm]
233: # The task [task]
234: # map [task->map]
235: #
236: define tasks
237: set $numtasks=default_pset->task_count
238: set $iter=0
239: set $taskptr=default_pset->tasks.next
240: while ($iter < $numtasks)
241: if ((((struct task *)($taskptr))->proc) != 0)
242: p (char *)(((struct task *)($taskptr))->proc->p_comm)
243: p $taskptr
244: p ((struct task *)($taskptr))->map
245: end
246: set $taskptr=((struct task *)($taskptr))->pset_tasks.next
247: set $iter=$iter+1
248: end
249: end
250: document tasks
251: Print all the tasks and maps associated with each one of them.
252: end
253:
254: #
255: # List all the threads.
256: # Print interesting information in the following order :
257: # Name of the task [thread->task->proc->p_comm]
258: # The thread [thread]
259: #
260: define threads
261: set $numthreads=default_pset->thread_count
262: set $iter=0
263: set $threadptr=default_pset->threads.next
264: while ($iter < $numthreads)
265: if ((((struct thread *)($threadptr))->task->proc) != 0)
266: p (char *)(((struct thread *)($threadptr))->task->proc->p_comm)
267: p $threadptr
268: end
269: set $threadptr=((struct thread *)($threadptr))->pset_threads.next
270: set $iter=$iter+1
271: end
272: end
273: document threads
274: Print all the threads and name of the task associated with each one of them.
275: end
276:
277: #
278: # List all the threads with a nonzero value of kernel_stack.
279: # Print interesting information in the following order :
280: # Name of the task [thread->task->proc->p_comm]
281: # The thread [thread]
282: #
283: define kstackthreads
284: set $numthreads=default_pset->thread_count
285: set $iter=0
286: set $threadptr=default_pset->threads.next
287: while ($iter < $numthreads)
288: if ((((struct thread *)($threadptr))->kernel_stack) != 0)
289: if ((((struct thread *)($threadptr))->task->proc) != 0)
290: p (char *)(((struct thread *)($threadptr))->task->proc->p_comm)
291: p $threadptr
292: end
293: end
294: set $threadptr=((struct thread *)($threadptr))->pset_threads.next
295: set $iter=$iter+1
296: end
297: end
298: document kstackthreads
299: Print all the threads with nonzero kernel_stack value,
300: and name of the task associated with each one of them.
301: end
302:
303: #
304: # List all the threads with a nonzero value of wait_event.
305: # Print interesting information in the following order :
306: # Name of the task [thread->task->proc->p_comm]
307: # The thread [thread]
308: # The wait event [thread->wait_event]
309: # The wait message [thread->wait_mesg]
310: #
311: define waitthreads
312: set $numthreads=default_pset->thread_count
313: set $iter=0
314: set $threadptr=default_pset->threads.next
315: while ($iter < $numthreads)
316: if ((((struct thread *)($threadptr))->wait_event) != 0)
317: p (char *)(((struct thread *)($threadptr))->task->proc->p_comm)
318: p $threadptr
319: p ((struct thread *)($threadptr))->wait_event
320: p ((struct thread *)($threadptr))->wait_mesg
321: end
322: set $threadptr=((struct thread *)($threadptr))->pset_threads.next
323: set $iter=$iter+1
324: end
325: end
326: document waitthreads
327: Print all the threads with nonzero wait_event value,
328: and name of the task associated with each one of them.
329: Also print wait_event and wait_mesg.
330: end
331:
332: define setRegFromSaved
333: set $s_pc=(long)$pc
334: set $s_lr=(long)$lr
335: set $s_r1=(long)$r1
336: set $s_r13=(long)$r13
337: set $s_r14=(long)$r14
338: set $s_r15=(long)$r15
339: set $s_r16=(long)$r16
340: set $s_r17=(long)$r17
341: set $s_r18=(long)$r18
342: set $s_r19=(long)$r19
343: set $s_r20=(long)$r20
344: set $s_r21=(long)$r21
345: set $s_r22=(long)$r22
346: set $s_r23=(long)$r23
347: set $s_r24=(long)$r24
348: set $s_r25=(long)$r25
349: set $s_r26=(long)$r26
350: set $s_r27=(long)$r27
351: set $s_r28=(long)$r28
352: set $s_r29=(long)$r29
353: set $s_r30=(long)$r30
354: set $s_r31=(long)$r31
355: x/i $s_pc
356: end
357:
358: define printReg
359: printf "pc\t0x%x\n", $s_pc
360: printf "lr\t0x%x\n", $s_lr
361: printf "r1\t0x%x\n", $s_r1
362: printf "r13\t0x%x\n", $s_r13
363: printf "r14\t0x%x\n", $s_r14
364: printf "r15\t0x%x\n", $s_r15
365: printf "r16\t0x%x\n", $s_r16
366: printf "r17\t0x%x\n", $s_r17
367: printf "r18\t0x%x\n", $s_r18
368: printf "r19\t0x%x\n", $s_r19
369: printf "r20\t0x%x\n", $s_r20
370: printf "r21\t0x%x\n", $s_r21
371: printf "r22\t0x%x\n", $s_r22
372: printf "r23\t0x%x\n", $s_r23
373: printf "r24\t0x%x\n", $s_r24
374: printf "r25\t0x%x\n", $s_r25
375: printf "r26\t0x%x\n", $s_r26
376: printf "r27\t0x%x\n", $s_r27
377: printf "r28\t0x%x\n", $s_r28
378: printf "r29\t0x%x\n", $s_r29
379: printf "r30\t0x%x\n", $s_r30
380: printf "r31\t0x%x\n", $s_r31
381: end
382:
383: define popReg
384: if (*(long*)$s_r1) == 0
385: echo end of stack\n
386: else
387: set $s_r1=*(long*)$s_r1
388: set $s_lr=*(long*)($s_r1+8)
389: set $s_t1=$s_r1
390: if $arg0 != 0
391: if $arg0 <= 31
392: set $s_t1=$s_t1-4
393: set $s_r31=*(long*)$s_t1
394: end
395: if $arg0 <= 30
396: set $s_t1=$s_t1-4
397: set $s_r30=*(long*)$s_t1
398: end
399: if $arg0 <= 29
400: set $s_t1=$s_t1-4
401: set $s_r29=*(long*)$s_t1
402: end
403: if $arg0 <= 28
404: set $s_t1=$s_t1-4
405: set $s_r28=*(long*)$s_t1
406: end
407: if $arg0 <= 27
408: set $s_t1=$s_t1-4
409: set $s_r27=*(long*)$s_t1
410: end
411: if $arg0 <= 26
412: set $s_t1=$s_t1-4
413: set $s_r26=*(long*)$s_t1
414: end
415: if $arg0 <= 25
416: set $s_t1=$s_t1-4
417: set $s_r25=*(long*)$s_t1
418: end
419: if $arg0 <= 24
420: set $s_t1=$s_t1-4
421: set $s_r24=*(long*)$s_t1
422: end
423: if $arg0 <= 23
424: set $s_t1=$s_t1-4
425: set $s_r23=*(long*)$s_t1
426: end
427: if $arg0 <= 22
428: set $s_t1=$s_t1-4
429: set $s_r22=*(long*)$s_t1
430: end
431: if $arg0 <= 21
432: set $s_t1=$s_t1-4
433: set $s_r21=*(long*)$s_t1
434: end
435: if $arg0 <= 20
436: set $s_t1=$s_t1-4
437: set $s_r20=*(long*)$s_t1
438: end
439: if $arg0 <= 19
440: set $s_t1=$s_t1-4
441: set $s_r19=*(long*)$s_t1
442: end
443: if $arg0 <= 18
444: set $s_t1=$s_t1-4
445: set $s_r18=*(long*)$s_t1
446: end
447: if $arg0 <= 17
448: set $s_t1=$s_t1-4
449: set $s_r17=*(long*)$s_t1
450: end
451: if $arg0 <= 16
452: set $s_t1=$s_t1-4
453: set $s_r16=*(long*)$s_t1
454: end
455: end
456: set $s_pc=$s_lr-4
457: x/i $s_pc
458: end
459: end
460:
461: define wherePC
462: x/i $s_pc
463: end
464:
465: define popSaved
466: set $s_t1=(struct ppc_saved_state *)($s_r1+0x90)
467: set $s_pc=(long)$s_t1->srr0
468: set $s_lr=(long)$s_t1->lr
469: set $s_r1=(long)$s_t1->r1
470: set $s_r13=(long)$s_t1->r13
471: set $s_r14=(long)$s_t1->r14
472: set $s_r15=(long)$s_t1->r15
473: set $s_r16=(long)$s_t1->r16
474: set $s_r17=(long)$s_t1->r17
475: set $s_r18=(long)$s_t1->r18
476: set $s_r19=(long)$s_t1->r19
477: set $s_r20=(long)$s_t1->r20
478: set $s_r21=(long)$s_t1->r21
479: set $s_r22=(long)$s_t1->r22
480: set $s_r23=(long)$s_t1->r23
481: set $s_r24=(long)$s_t1->r24
482: set $s_r25=(long)$s_t1->r25
483: set $s_r26=(long)$s_t1->r26
484: set $s_r27=(long)$s_t1->r27
485: set $s_r28=(long)$s_t1->r28
486: set $s_r29=(long)$s_t1->r29
487: set $s_r30=(long)$s_t1->r30
488: set $s_r31=(long)$s_t1->r31
489: x/i $s_pc
490: end
491:
492: define setRegFromThread
493: set $s_t1=(thread_t)$arg0
494: set $s_t1=(struct ppc_kernel_state *)(($s_t1->kernel_stack)+0x3f94)
495: set $s_pc=(long)$s_t1->lr
496: set $s_lr=(long)$s_t1->lr
497: set $s_r1=(long)$s_t1->r1
498: set $s_r13=(long)$s_t1->r13[0]
499: set $s_r14=(long)$s_t1->r13[1]
500: set $s_r15=(long)$s_t1->r13[2]
501: set $s_r16=(long)$s_t1->r13[3]
502: set $s_r17=(long)$s_t1->r13[4]
503: set $s_r18=(long)$s_t1->r13[5]
504: set $s_r19=(long)$s_t1->r13[6]
505: set $s_r20=(long)$s_t1->r13[7]
506: set $s_r21=(long)$s_t1->r13[8]
507: set $s_r22=(long)$s_t1->r13[9]
508: set $s_r23=(long)$s_t1->r13[10]
509: set $s_r24=(long)$s_t1->r13[11]
510: set $s_r25=(long)$s_t1->r13[12]
511: set $s_r26=(long)$s_t1->r13[13]
512: set $s_r27=(long)$s_t1->r13[14]
513: set $s_r28=(long)$s_t1->r13[15]
514: set $s_r29=(long)$s_t1->r13[16]
515: set $s_r30=(long)$s_t1->r13[17]
516: set $s_r31=(long)$s_t1->r13[18]
517: x/i $s_pc
518: end
519:
520: define popLR
521: set $s_pc=$s_lr-4
522: x/i $s_pc
523: end
524:
525: #
526: # Difficult to ducument macros
527: #
528: define sustack
529: set $u=(long*)((((int)$arg0) & 0x0FFFFFFF) + 0x60000000)
530: p/x $u
531: p/x *($u+2)-4
532: end
533:
534: define ustack
535: if (*(long*)$u) != 0
536: set $u=(long*)((((int)(*(long*)$u)) & 0x0FFFFFFF) + 0x60000000)
537: p/x $u
538: if (((int)(*($u+2)-4)) & 0xF0000000) == 0
539: x/i ((((int)(*($u+2)-4)) & 0x0FFFFFFF) + 0x20000000)
540: else
541: p/x *($u+2)-4
542: end
543: else
544: echo end of user stack\n
545: end
546: end
547:
548: #
549: # Obscure macros for printing zones
550: #
551:
552: define dcz
553: p *(zone_t)$arg0
554: end
555: document dcz
556: Print first argument as a zone_t.
557: end
558:
559: define dzleak
560: if (((zone_t)$arg0)->zone_name != 0)
561: p (char *)(((zone_t)($arg0))->zone_name)
562: end
563: echo " num elem used "
564: p/x $arg0->count
565: echo " curr zone size "
566: p/x $arg0->cur_size
567: echo " max zone size "
568: p/x $arg0->max_size
569: if ($arg0->free_elements !=0)
570: echo " next free element"
571: p/x $arg0->free_elements
572: end
573: if ( $arg0->doing_alloc != 0)
574: echo " doing allocation"
575: p/x $arg0->doing_alloc
576: end
577: echo " allocation size"
578: p/x $arg0->alloc_size
579: if ( $arg0->pageable != 0)
580: echo " zone is pageable\n"
581: end
582: if ( $arg0->sleepable != 0)
583: echo " zone is sleepable\n"
584: end
585: if ( $arg0->exhaustible != 0)
586: echo " zone is exhaustible\n"
587: end
588: if ( $arg0->expandable != 0)
589: echo " zone is expandable\n"
590: end
591: set $iter=0
592: while ($iter < $arg0->num_alloc_callers)
593: p/x *(struct caller_s *)$arg0->alloc_callers[$iter]
594: set $iter=$iter+1
595: end
596: echo " number of alloc callers "
597: p/x $arg0->num_alloc_callers
598: set $iter=0
599: while ($iter < $arg0->num_free_callers)
600: p/x *(struct caller_s *)$arg0->free_callers[$iter]
601: set $iter=$iter+1
602: end
603: echo " number of free callers "
604: p/x $arg0->num_free_callers
605: end
606:
607: define dz
608: if (((zone_t)$arg0)->zone_name != 0)
609: p (char *)(((zone_t)($arg0))->zone_name)
610: end
611: echo " num elem used "
612: p/x $arg0->count
613: echo " curr zone size "
614: p/x $arg0->cur_size
615: echo " max zone size "
616: p/x $arg0->max_size
617: if ($arg0->free_elements !=0)
618: echo " next free element"
619: p/x $arg0->free_elements
620: end
621: if ( $arg0->doing_alloc != 0)
622: echo " doing allocation"
623: p/x $arg0->doing_alloc
624: end
625: echo " allocation size"
626: p/x $arg0->alloc_size
627: if ( $arg0->pageable != 0)
628: echo " zone is pageable\n"
629: end
630: if ( $arg0->sleepable != 0)
631: echo " zone is sleepable\n"
632: end
633: if ( $arg0->exhaustible != 0)
634: echo " zone is exhaustible\n"
635: end
636: if ( $arg0->expandable != 0)
637: echo " zone is expandable\n"
638: end
639: end
640:
641: define daz
642: set $numtasks=default_pset->task_count
643: set $iter=0
644: set $zoneptr=zone_zone
645: while ($zoneptr != 0)
646: echo \n
647: dz $zoneptr
648: set $zoneptr=((zone_t)($zoneptr))->next_zone
649: set $iter=$iter+1
650: end
651: echo number of zones =
652: p $iter
653: end
654:
655: define dleakaz
656: set $numtasks=default_pset->task_count
657: set $iter=0
658: set $zoneptr=zone_zone
659: while ($zoneptr != 0)
660: echo \n
661: dzleak $zoneptr
662: set $zoneptr=((zone_t)($zoneptr))->next_zone
663: set $iter=$iter+1
664: end
665: echo number of zones =
666: p $iter
667: end
668:
669: #
670: # prints info about a TAILQ: how many are in the list and total KB
671: #
672: define tqcount
673: echo $arg0\ $arg2\ length\ is
674: set $tqptr=($arg0).tqh_first
675: set $iter=0
676: set $size=0
677: while ($tqptr)
678: set $size=$size + ((struct $arg1 *)$tqptr)->$arg3
679: set $tqptr=((struct $arg1 *)$tqptr)->$arg2.tqe_next
680: set $iter=$iter + 1
681: end
682: printf " %d kbytes is 0x%x\n",$iter,$size/1024
683: end
684: document tqcount
685: prints info about a TAILQ: how many are in the list and total KB
686: end
687:
688: #
689: # prints info about the buffer cache queues
690: #
691: define bufinfo
692: printf "nbuf is %d\n",nbuf
693: printf "niobuf is %d\n",niobuf
694: printf "bufpages is %d\n",bufpages
695: printf "LOCKED "
696: tqcount bufqueues[0] buf b_freelist b_bufsize
697: printf "LRU "
698: tqcount bufqueues[1] buf b_freelist b_bufsize
699: printf "AGE "
700: tqcount bufqueues[2] buf b_freelist b_bufsize
701: printf "EMPTY "
702: tqcount bufqueues[3] buf b_freelist b_bufsize
703: tqcount iobufqueue buf b_freelist b_bufsize
704: end
705: document bufinfo
706: prints info about the buffer cache queues
707: end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.