]> code.delx.au - gnu-emacs/blob - src/.gdbinit
2051475bea0af08c337f116bd9c3a17573209919
[gnu-emacs] / src / .gdbinit
1 # Copyright (C) 1992-1998, 2000-2011 Free Software Foundation, Inc.
2 #
3 # This file is part of GNU Emacs.
4 #
5 # GNU Emacs is free software; you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; either version 3, or (at your option)
8 # any later version.
9 #
10 # GNU Emacs is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with GNU Emacs; see the file COPYING. If not, write to the
17 # Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 # Boston, MA 02110-1301, USA.
19
20 # Force loading of symbols, enough to give us gdb_valbits etc.
21 set main
22 # With some compilers, we need this to give us struct Lisp_Symbol etc.:
23 set Fmake_symbol
24
25 # Find lwlib source files too.
26 dir ../lwlib
27 #dir /gd/gnu/lesstif-0.89.9/lib/Xm
28
29 # Don't enter GDB when user types C-g to quit.
30 # This has one unfortunate effect: you can't type C-c
31 # at the GDB to stop Emacs, when using X.
32 # However, C-z works just as well in that case.
33 handle 2 noprint pass
34
35 # Make it work like SIGINT normally does.
36 handle SIGTSTP nopass
37
38 # Pass on user signals
39 handle SIGUSR1 noprint pass
40 handle SIGUSR2 noprint pass
41
42 # Don't pass SIGALRM to Emacs. This makes problems when
43 # debugging.
44 handle SIGALRM ignore
45
46 # $valmask and $tagmask are mask values set up by the xreload macro below.
47
48 # Use $bugfix so that the value isn't a constant.
49 # Using a constant runs into GDB bugs sometimes.
50 define xgetptr
51 set $bugfix = $arg0
52 set $ptr = (gdb_use_union ? (gdb_use_lsb ? $bugfix.u.val << gdb_gctypebits : $bugfix.u.val) : $bugfix & $valmask) | gdb_data_seg_bits
53 end
54
55 define xgetint
56 set $bugfix = $arg0
57 set $int = gdb_use_union ? $bugfix.s.val : (gdb_use_lsb ? $bugfix : $bugfix << gdb_gctypebits) >> gdb_gctypebits
58 end
59
60 define xgettype
61 set $bugfix = $arg0
62 set $type = gdb_use_union ? $bugfix.s.type : (enum Lisp_Type) (gdb_use_lsb ? $bugfix & $tagmask : $bugfix >> gdb_valbits)
63 end
64
65 # Set up something to print out s-expressions.
66 # We save and restore print_output_debug_flag to prevent the w32 port
67 # from calling OutputDebugString, which causes GDB to display each
68 # character twice (yuk!).
69 define pr
70 set $output_debug = print_output_debug_flag
71 set print_output_debug_flag = 0
72 set debug_print ($)
73 set print_output_debug_flag = $output_debug
74 end
75 document pr
76 Print the emacs s-expression which is $.
77 Works only when an inferior emacs is executing.
78 end
79
80 # Print out s-expressions
81 define pp
82 set $tmp = $arg0
83 set $output_debug = print_output_debug_flag
84 set print_output_debug_flag = 0
85 set safe_debug_print ($tmp)
86 set print_output_debug_flag = $output_debug
87 end
88 document pp
89 Print the argument as an emacs s-expression
90 Works only when an inferior emacs is executing.
91 end
92
93 # Print out s-expressions from tool bar
94 define pp1
95 set $tmp = $arg0
96 set $output_debug = print_output_debug_flag
97 set print_output_debug_flag = 0
98 set safe_debug_print ($tmp)
99 set print_output_debug_flag = $output_debug
100 end
101 document pp1
102 Print the argument as an emacs s-expression.
103 Works only when an inferior emacs is executing.
104 For use on tool bar when debugging in Emacs
105 where the variable name would not otherwise
106 be recorded in the GUD buffer.
107 end
108
109 # Print value of lisp variable
110 define pv
111 set $tmp = "$arg0"
112 set $output_debug = print_output_debug_flag
113 set print_output_debug_flag = 0
114 set safe_debug_print ( find_symbol_value (intern ($tmp)))
115 set print_output_debug_flag = $output_debug
116 end
117 document pv
118 Print the value of the lisp variable given as argument.
119 Works only when an inferior emacs is executing.
120 end
121
122 # Print value of lisp variable
123 define pv1
124 set $tmp = "$arg0"
125 set $output_debug = print_output_debug_flag
126 set print_output_debug_flag = 0
127 set safe_debug_print (find_symbol_value (intern ($tmp)))
128 set print_output_debug_flag = $output_debug
129 end
130 document pv1
131 Print the value of the lisp variable given as argument.
132 Works only when an inferior emacs is executing.
133 For use when debugging in Emacs where the variable
134 name would not otherwise be recorded in the GUD buffer.
135 end
136
137 # Print out current buffer point and boundaries
138 define ppt
139 set $b = current_buffer
140 set $t = $b->text
141 printf "BUF PT: %d", $b->pt
142 if ($b->pt != $b->pt_byte)
143 printf "[%d]", $b->pt_byte
144 end
145 printf " of 1..%d", $t->z
146 if ($t->z != $t->z_byte)
147 printf "[%d]", $t->z_byte
148 end
149 if ($b->begv != 1 || $b->zv != $t->z)
150 printf " NARROW=%d..%d", $b->begv, $b->zv
151 if ($b->begv != $b->begv_byte || $b->zv != $b->zv_byte)
152 printf " [%d..%d]", $b->begv_byte, $b->zv_byte
153 end
154 end
155 printf " GAP: %d", $t->gpt
156 if ($t->gpt != $t->gpt_byte)
157 printf "[%d]", $t->gpt_byte
158 end
159 printf " SZ=%d\n", $t->gap_size
160 end
161 document ppt
162 Print current buffer's point and boundaries.
163 Prints values of point, beg, end, narrow, and gap for current buffer.
164 end
165
166 define pitmethod
167 set $itmethod = $arg0
168 # output $itmethod
169 if ($itmethod == 0)
170 printf "GET_FROM_BUFFER"
171 end
172 if ($itmethod == 1)
173 printf "GET_FROM_DISPLAY_VECTOR"
174 end
175 if ($itmethod == 2)
176 printf "GET_FROM_STRING"
177 end
178 if ($itmethod == 3)
179 printf "GET_FROM_C_STRING"
180 end
181 if ($itmethod == 4)
182 printf "GET_FROM_IMAGE"
183 end
184 if ($itmethod == 5)
185 printf "GET_FROM_STRETCH"
186 end
187 if ($itmethod < 0 || $itmethod > 5)
188 output $itmethod
189 end
190 end
191 document pitmethod
192 Pretty print it->method given as first arg
193 end
194
195 # Print out iterator given as first arg
196 define pitx
197 set $it = $arg0
198 printf "cur=%d", $it->current.pos.charpos
199 if ($it->current.pos.charpos != $it->current.pos.bytepos)
200 printf "[%d]", $it->current.pos.bytepos
201 end
202 printf " pos=%d", $it->position.charpos
203 if ($it->position.charpos != $it->position.bytepos)
204 printf "[%d]", $it->position.bytepos
205 end
206 printf " start=%d", $it->start.pos.charpos
207 if ($it->start.pos.charpos != $it->start.pos.bytepos)
208 printf "[%d]", $it->start.pos.bytepos
209 end
210 printf " end=%d", $it->end_charpos
211 printf " stop=%d", $it->stop_charpos
212 printf " face=%d", $it->face_id
213 if ($it->multibyte_p)
214 printf " MB"
215 end
216 if ($it->header_line_p)
217 printf " HL"
218 end
219 if ($it->n_overlay_strings > 0)
220 printf " nov=%d", $it->n_overlay_strings
221 end
222 if ($it->sp != 0)
223 printf " sp=%d", $it->sp
224 end
225 # IT_CHARACTER
226 if ($it->what == 0)
227 if ($it->len == 1 && $it->c >= ' ' && it->c < 255)
228 printf " ch='%c'", $it->c
229 else
230 printf " ch=[%d,%d]", $it->c, $it->len
231 end
232 else
233 printf " "
234 # output $it->what
235 if ($it->what == 0)
236 printf "IT_CHARACTER"
237 end
238 if ($it->what == 1)
239 printf "IT_COMPOSITION"
240 end
241 if ($it->what == 2)
242 printf "IT_IMAGE"
243 end
244 if ($it->what == 3)
245 printf "IT_STRETCH"
246 end
247 if ($it->what == 4)
248 printf "IT_EOB"
249 end
250 if ($it->what == 5)
251 printf "IT_TRUNCATION"
252 end
253 if ($it->what == 6)
254 printf "IT_CONTINUATION"
255 end
256 if ($it->what < 0 || $it->what > 6)
257 output $it->what
258 end
259 end
260 if ($it->method != 0)
261 # !GET_FROM_BUFFER
262 printf " next="
263 pitmethod $it->method
264 if ($it->method == 2)
265 # GET_FROM_STRING
266 printf "[%d]", $it->current.string_pos.charpos
267 end
268 if ($it->method == 4)
269 # GET_FROM_IMAGE
270 printf "[%d]", $it->image_id
271 end
272 end
273 printf "\n"
274 if ($it->bidi_p)
275 printf "BIDI: base_stop=%d prev_stop=%d level=%d\n", $it->base_level_stop, $it->prev_stop, $it->bidi_it.resolved_level
276 end
277 if ($it->region_beg_charpos >= 0)
278 printf "reg=%d-%d ", $it->region_beg_charpos, $it->region_end_charpos
279 end
280 printf "vpos=%d hpos=%d", $it->vpos, $it->hpos,
281 printf " y=%d lvy=%d", $it->current_y, $it->last_visible_y
282 printf " x=%d vx=%d-%d", $it->current_x, $it->first_visible_x, $it->last_visible_x
283 printf " w=%d", $it->pixel_width
284 printf " a+d=%d+%d=%d", $it->ascent, $it->descent, $it->ascent+$it->descent
285 printf " max=%d+%d=%d", $it->max_ascent, $it->max_descent, $it->max_ascent+$it->max_descent
286 printf "\n"
287 set $i = 0
288 while ($i < $it->sp && $i < 4)
289 set $e = $it->stack[$i]
290 printf "stack[%d]: ", $i
291 pitmethod $e->method
292 printf "[%d]", $e->position.charpos
293 printf "\n"
294 set $i = $i + 1
295 end
296 end
297 document pitx
298 Pretty print a display iterator.
299 Take one arg, an iterator object or pointer.
300 end
301
302 define pit
303 pitx it
304 end
305 document pit
306 Pretty print the display iterator it.
307 end
308
309 define prowx
310 set $row = $arg0
311 printf "y=%d x=%d pwid=%d", $row->y, $row->x, $row->pixel_width
312 printf " a+d=%d+%d=%d", $row->ascent, $row->height-$row->ascent, $row->height
313 printf " phys=%d+%d=%d", $row->phys_ascent, $row->phys_height-$row->phys_ascent, $row->phys_height
314 printf " vis=%d\n", $row->visible_height
315 printf "used=(LMargin=%d,Text=%d,RMargin=%d) Hash=%d\n", $row->used[0], $row->used[1], $row->used[2], $row->hash
316 printf "start=%d end=%d", $row->start.pos.charpos, $row->end.pos.charpos
317 if ($row->enabled_p)
318 printf " ENA"
319 end
320 if ($row->displays_text_p)
321 printf " DISP"
322 end
323 if ($row->mode_line_p)
324 printf " MODEL"
325 end
326 if ($row->continued_p)
327 printf " CONT"
328 end
329 if ($row-> truncated_on_left_p)
330 printf " TRUNC:L"
331 end
332 if ($row-> truncated_on_right_p)
333 printf " TRUNC:R"
334 end
335 if ($row->starts_in_middle_of_char_p)
336 printf " STARTMID"
337 end
338 if ($row->ends_in_middle_of_char_p)
339 printf " ENDMID"
340 end
341 if ($row->ends_in_newline_from_string_p)
342 printf " ENDNLFS"
343 end
344 if ($row->ends_at_zv_p)
345 printf " ENDZV"
346 end
347 if ($row->overlapped_p)
348 printf " OLAPD"
349 end
350 if ($row->overlapping_p)
351 printf " OLAPNG"
352 end
353 printf "\n"
354 end
355 document prowx
356 Pretty print information about glyph_row.
357 Takes one argument, a row object or pointer.
358 end
359
360 define prow
361 prowx row
362 end
363 document prow
364 Pretty print information about glyph_row in row.
365 end
366
367
368 define pcursorx
369 set $cp = $arg0
370 printf "y=%d x=%d vpos=%d hpos=%d", $cp->y, $cp->x, $cp->vpos, $cp->hpos
371 end
372 document pcursorx
373 Pretty print a window cursor.
374 end
375
376 define pcursor
377 printf "output: "
378 pcursorx output_cursor
379 printf "\n"
380 end
381 document pcursor
382 Pretty print the output_cursor.
383 end
384
385 define pwinx
386 set $w = $arg0
387 xgetint $w->sequence_number
388 if ($w->mini_p != Qnil)
389 printf "Mini "
390 end
391 printf "Window %d ", $int
392 xgetptr $w->buffer
393 set $tem = (struct buffer *) $ptr
394 xgetptr $tem->name_
395 printf "%s", ((struct Lisp_String *) $ptr)->data
396 printf "\n"
397 xgetptr $w->start
398 set $tem = (struct Lisp_Marker *) $ptr
399 printf "start=%d end:", $tem->charpos
400 if ($w->window_end_valid != Qnil)
401 xgetint $w->window_end_pos
402 printf "pos=%d", $int
403 xgetint $w->window_end_vpos
404 printf " vpos=%d", $int
405 else
406 printf "invalid"
407 end
408 printf " vscroll=%d", $w->vscroll
409 if ($w->force_start != Qnil)
410 printf " FORCE_START"
411 end
412 if ($w->must_be_updated_p)
413 printf " MUST_UPD"
414 end
415 printf "\n"
416 printf "cursor: "
417 pcursorx $w->cursor
418 printf " phys: "
419 pcursorx $w->phys_cursor
420 if ($w->phys_cursor_on_p)
421 printf " ON"
422 else
423 printf " OFF"
424 end
425 printf " blk="
426 if ($w->last_cursor_off_p != $w->cursor_off_p)
427 if ($w->last_cursor_off_p)
428 printf "ON->"
429 else
430 printf "OFF->"
431 end
432 end
433 if ($w->cursor_off_p)
434 printf "ON"
435 else
436 printf "OFF"
437 end
438 printf "\n"
439 end
440 document pwinx
441 Pretty print a window structure.
442 Takes one argument, a pointer to a window structure.
443 end
444
445 define pwin
446 pwinx w
447 end
448 document pwin
449 Pretty print window structure w.
450 end
451
452 define pbiditype
453 if ($arg0 == 0)
454 printf "UNDEF"
455 end
456 if ($arg0 == 1)
457 printf "L"
458 end
459 if ($arg0 == 2)
460 printf "R"
461 end
462 if ($arg0 == 3)
463 printf "EN"
464 end
465 if ($arg0 == 4)
466 printf "AN"
467 end
468 if ($arg0 == 5)
469 printf "BN"
470 end
471 if ($arg0 == 6)
472 printf "B"
473 end
474 if ($arg0 < 0 || $arg0 > 6)
475 printf "%d??", $arg0
476 end
477 end
478 document pbiditype
479 Print textual description of bidi type given as first argument.
480 end
481
482 define pgx
483 set $g = $arg0
484 # CHAR_GLYPH
485 if ($g.type == 0)
486 if ($g.u.ch >= ' ' && $g.u.ch < 127)
487 printf "CHAR[%c]", $g.u.ch
488 else
489 printf "CHAR[0x%x]", $g.u.ch
490 end
491 end
492 # COMPOSITE_GLYPH
493 if ($g.type == 1)
494 printf "COMP[%d (%d..%d)]", $g.u.cmp.id, $g.slice.cmp.from, $g.slice.cmp.to
495 end
496 # GLYPHLESS_GLYPH
497 if ($g.type == 2)
498 printf "GLYPHLESS["
499 if ($g.u.glyphless.method == 0)
500 printf "THIN]"
501 end
502 if ($g.u.glyphless.method == 1)
503 printf "EMPTY]"
504 end
505 if ($g.u.glyphless.method == 2)
506 printf "ACRO]"
507 end
508 if ($g.u.glyphless.method == 3)
509 printf "HEX]"
510 end
511 end
512 # IMAGE_GLYPH
513 if ($g.type == 3)
514 printf "IMAGE[%d]", $g.u.img_id
515 end
516 # STRETCH_GLYPH
517 if ($g.type == 4)
518 printf "STRETCH[%d+%d]", $g.u.stretch.height, $g.u.stretch.ascent
519 end
520 xgettype ($g.object)
521 if ($type == Lisp_String)
522 printf " str=%x[%d]", $g.object, $g.charpos
523 else
524 printf " pos=%d", $g.charpos
525 end
526 # For characters, print their resolved level and bidi type
527 if ($g.type == 0)
528 printf " blev=%d,btyp=", $g.resolved_level
529 pbiditype $g.bidi_type
530 end
531 printf " w=%d a+d=%d+%d", $g.pixel_width, $g.ascent, $g.descent
532 # If not DEFAULT_FACE_ID
533 if ($g.face_id != 0)
534 printf " face=%d", $g.face_id
535 end
536 if ($g.voffset)
537 printf " vof=%d", $g.voffset
538 end
539 if ($g.multibyte_p)
540 printf " MB"
541 end
542 if ($g.padding_p)
543 printf " PAD"
544 end
545 if ($g.glyph_not_available_p)
546 printf " N/A"
547 end
548 if ($g.overlaps_vertically_p)
549 printf " OVL"
550 end
551 if ($g.avoid_cursor_p)
552 printf " AVOID"
553 end
554 if ($g.left_box_line_p)
555 printf " ["
556 end
557 if ($g.right_box_line_p)
558 printf " ]"
559 end
560 if ($g.slice.img.x || $g.slice.img.y || $g.slice.img.width || $g.slice.img.height)
561 printf " slice=%d,%d,%d,%d" ,$g.slice.img.x, $g.slice.img.y, $g.slice.img.width, $g.slice.img.height
562 end
563 printf "\n"
564 end
565 document pgx
566 Pretty print a glyph structure.
567 Takes one argument, a pointer to a glyph structure.
568 end
569
570 define pg
571 set $pgidx = 0
572 pgx glyph
573 end
574 document pg
575 Pretty print glyph structure glyph.
576 end
577
578 define pgi
579 set $pgidx = $arg0
580 pgx (&glyph[$pgidx])
581 end
582 document pgi
583 Pretty print glyph structure glyph[I].
584 Takes one argument, a integer I.
585 end
586
587 define pgn
588 set $pgidx = $pgidx + 1
589 pgx (&glyph[$pgidx])
590 end
591 document pgn
592 Pretty print next glyph structure.
593 end
594
595 define pgrowx
596 set $row = $arg0
597 set $area = 0
598 set $xofs = $row->x
599 while ($area < 3)
600 set $used = $row->used[$area]
601 if ($used > 0)
602 set $gl0 = $row->glyphs[$area]
603 set $pgidx = 0
604 printf "%s: %d glyphs\n", ($area == 0 ? "LEFT" : $area == 2 ? "RIGHT" : "TEXT"), $used
605 while ($pgidx < $used)
606 printf "%3d %4d: ", $pgidx, $xofs
607 pgx $gl0[$pgidx]
608 set $xofs = $xofs + $gl0[$pgidx]->pixel_width
609 set $pgidx = $pgidx + 1
610 end
611 end
612 set $area = $area + 1
613 end
614 end
615 document pgrowx
616 Pretty print all glyphs in a row structure.
617 Takes one argument, a pointer to a row structure.
618 end
619
620 define pgrow
621 pgrowx row
622 end
623 document pgrow
624 Pretty print all glyphs in row structure row.
625 end
626
627 define pgrowit
628 pgrowx it->glyph_row
629 end
630 document pgrowit
631 Pretty print all glyphs in it->glyph_row.
632 end
633
634 define prowlims
635 printf "edges=(%d,%d),r2l=%d,cont=%d,trunc=(%d,%d),at_zv=%d\n", $arg0->minpos.charpos, $arg0->maxpos.charpos, $arg0->reversed_p, $arg0->continued_p, $arg0->truncated_on_left_p, $arg0->truncated_on_right_p, $arg0->ends_at_zv_p
636 end
637 document prowlims
638 Print important attributes of a glyph_row structure.
639 Takes one argument, a pointer to a glyph_row structure.
640 end
641
642 define pmtxrows
643 set $mtx = $arg0
644 set $gl = $mtx->rows
645 set $glend = $mtx->rows + $mtx->nrows - 1
646 set $i = 0
647 while ($gl < $glend)
648 printf "%d: ", $i
649 prowlims $gl
650 set $gl = $gl + 1
651 set $i = $i + 1
652 end
653 end
654 document pmtxrows
655 Print data about glyph rows in a glyph matrix.
656 Takes one argument, a pointer to a glyph_matrix structure.
657 end
658
659 define xtype
660 xgettype $
661 output $type
662 echo \n
663 if $type == Lisp_Misc
664 xmisctype
665 else
666 if $type == Lisp_Vectorlike
667 xvectype
668 end
669 end
670 end
671 document xtype
672 Print the type of $, assuming it is an Emacs Lisp value.
673 If the first type printed is Lisp_Vector or Lisp_Misc,
674 a second line gives the more precise type.
675 end
676
677 define xvectype
678 xgetptr $
679 set $size = ((struct Lisp_Vector *) $ptr)->header.size
680 output ($size & PVEC_FLAG) ? (enum pvec_type) ($size & PVEC_TYPE_MASK) : $size & ~gdb_array_mark_flag
681 echo \n
682 end
683 document xvectype
684 Print the size or vector subtype of $.
685 This command assumes that $ is a vector or pseudovector.
686 end
687
688 define xmisctype
689 xgetptr $
690 output (enum Lisp_Misc_Type) (((struct Lisp_Free *) $ptr)->type)
691 echo \n
692 end
693 document xmisctype
694 Assume that $ is some misc type and print its specific type.
695 end
696
697 define xint
698 xgetint $
699 print $int
700 end
701 document xint
702 Print $ as an Emacs Lisp integer. This gets the sign right.
703 end
704
705 define xptr
706 xgetptr $
707 print (void *) $ptr
708 end
709 document xptr
710 Print the pointer portion of an Emacs Lisp value in $.
711 end
712
713 define xmarker
714 xgetptr $
715 print (struct Lisp_Marker *) $ptr
716 end
717 document xmarker
718 Print $ as a marker pointer.
719 This command assumes that $ is an Emacs Lisp marker value.
720 end
721
722 define xoverlay
723 xgetptr $
724 print (struct Lisp_Overlay *) $ptr
725 end
726 document xoverlay
727 Print $ as a overlay pointer.
728 This command assumes that $ is an Emacs Lisp overlay value.
729 end
730
731 define xmiscfree
732 xgetptr $
733 print (struct Lisp_Free *) $ptr
734 end
735 document xmiscfree
736 Print $ as a misc free-cell pointer.
737 This command assumes that $ is an Emacs Lisp Misc value.
738 end
739
740 define xintfwd
741 xgetptr $
742 print (struct Lisp_Intfwd *) $ptr
743 end
744 document xintfwd
745 Print $ as an integer forwarding pointer.
746 This command assumes that $ is an Emacs Lisp Misc value.
747 end
748
749 define xboolfwd
750 xgetptr $
751 print (struct Lisp_Boolfwd *) $ptr
752 end
753 document xboolfwd
754 Print $ as a boolean forwarding pointer.
755 This command assumes that $ is an Emacs Lisp Misc value.
756 end
757
758 define xobjfwd
759 xgetptr $
760 print (struct Lisp_Objfwd *) $ptr
761 end
762 document xobjfwd
763 Print $ as an object forwarding pointer.
764 This command assumes that $ is an Emacs Lisp Misc value.
765 end
766
767 define xbufobjfwd
768 xgetptr $
769 print (struct Lisp_Buffer_Objfwd *) $ptr
770 end
771 document xbufobjfwd
772 Print $ as a buffer-local object forwarding pointer.
773 This command assumes that $ is an Emacs Lisp Misc value.
774 end
775
776 define xkbobjfwd
777 xgetptr $
778 print (struct Lisp_Kboard_Objfwd *) $ptr
779 end
780 document xkbobjfwd
781 Print $ as a kboard-local object forwarding pointer.
782 This command assumes that $ is an Emacs Lisp Misc value.
783 end
784
785 define xbuflocal
786 xgetptr $
787 print (struct Lisp_Buffer_Local_Value *) $ptr
788 end
789 document xbuflocal
790 Print $ as a buffer-local-value pointer.
791 This command assumes that $ is an Emacs Lisp Misc value.
792 end
793
794 define xsymbol
795 set $sym = $
796 xgetptr $sym
797 print (struct Lisp_Symbol *) $ptr
798 xprintsym $sym
799 echo \n
800 end
801 document xsymbol
802 Print the name and address of the symbol $.
803 This command assumes that $ is an Emacs Lisp symbol value.
804 end
805
806 define xstring
807 xgetptr $
808 print (struct Lisp_String *) $ptr
809 xprintstr $
810 echo \n
811 end
812 document xstring
813 Print the contents and address of the string $.
814 This command assumes that $ is an Emacs Lisp string value.
815 end
816
817 define xvector
818 xgetptr $
819 print (struct Lisp_Vector *) $ptr
820 output ($->header.size > 50) ? 0 : ($->contents[0])@($->header.size & ~gdb_array_mark_flag)
821 echo \n
822 end
823 document xvector
824 Print the contents and address of the vector $.
825 This command assumes that $ is an Emacs Lisp vector value.
826 end
827
828 define xprocess
829 xgetptr $
830 print (struct Lisp_Process *) $ptr
831 output *$
832 echo \n
833 end
834 document xprocess
835 Print the address of the struct Lisp_process to which $ points.
836 This command assumes that $ is a Lisp_Object.
837 end
838
839 define xframe
840 xgetptr $
841 print (struct frame *) $ptr
842 xgetptr $->name
843 set $ptr = (struct Lisp_String *) $ptr
844 xprintstr $ptr
845 echo \n
846 end
847 document xframe
848 Print $ as a frame pointer.
849 This command assumes $ is an Emacs Lisp frame value.
850 end
851
852 define xcompiled
853 xgetptr $
854 print (struct Lisp_Vector *) $ptr
855 output ($->contents[0])@($->header.size & 0xff)
856 end
857 document xcompiled
858 Print $ as a compiled function pointer.
859 This command assumes that $ is an Emacs Lisp compiled value.
860 end
861
862 define xwindow
863 xgetptr $
864 print (struct window *) $ptr
865 set $window = (struct window *) $ptr
866 xgetint $window->total_cols
867 set $width=$int
868 xgetint $window->total_lines
869 set $height=$int
870 xgetint $window->left_col
871 set $left=$int
872 xgetint $window->top_line
873 set $top=$int
874 printf "%dx%d+%d+%d\n", $width, $height, $left, $top
875 end
876 document xwindow
877 Print $ as a window pointer, assuming it is an Emacs Lisp window value.
878 Print the window's position as "WIDTHxHEIGHT+LEFT+TOP".
879 end
880
881 define xwinconfig
882 xgetptr $
883 print (struct save_window_data *) $ptr
884 end
885 document xwinconfig
886 Print $ as a window configuration pointer.
887 This command assumes that $ is an Emacs Lisp window configuration value.
888 end
889
890 define xsubr
891 xgetptr $
892 print (struct Lisp_Subr *) $ptr
893 output *$
894 echo \n
895 end
896 document xsubr
897 Print the address of the subr which the Lisp_Object $ points to.
898 end
899
900 define xchartable
901 xgetptr $
902 print (struct Lisp_Char_Table *) $ptr
903 printf "Purpose: "
904 xprintsym $->purpose
905 printf " %d extra slots", ($->header.size & 0x1ff) - 68
906 echo \n
907 end
908 document xchartable
909 Print the address of the char-table $, and its purpose.
910 This command assumes that $ is an Emacs Lisp char-table value.
911 end
912
913 define xsubchartable
914 xgetptr $
915 print (struct Lisp_Sub_Char_Table *) $ptr
916 xgetint $->depth
917 set $depth = $int
918 xgetint $->min_char
919 printf "Depth: %d, Min char: %d (0x%x)\n", $depth, $int, $int
920 end
921 document xsubchartable
922 Print the address of the sub-char-table $, its depth and min-char.
923 This command assumes that $ is an Emacs Lisp sub-char-table value.
924 end
925
926 define xboolvector
927 xgetptr $
928 print (struct Lisp_Bool_Vector *) $ptr
929 output ($->header.size > 256) ? 0 : ($->data[0])@((($->header.size & ~gdb_array_mark_flag) + 7)/ 8)
930 echo \n
931 end
932 document xboolvector
933 Print the contents and address of the bool-vector $.
934 This command assumes that $ is an Emacs Lisp bool-vector value.
935 end
936
937 define xbuffer
938 xgetptr $
939 print (struct buffer *) $ptr
940 xgetptr $->name_
941 output ((struct Lisp_String *) $ptr)->data
942 echo \n
943 end
944 document xbuffer
945 Set $ as a buffer pointer and the name of the buffer.
946 This command assumes $ is an Emacs Lisp buffer value.
947 end
948
949 define xhashtable
950 xgetptr $
951 print (struct Lisp_Hash_Table *) $ptr
952 end
953 document xhashtable
954 Set $ as a hash table pointer.
955 This command assumes that $ is an Emacs Lisp hash table value.
956 end
957
958 define xcons
959 xgetptr $
960 print (struct Lisp_Cons *) $ptr
961 output/x *$
962 echo \n
963 end
964 document xcons
965 Print the contents of $ as an Emacs Lisp cons.
966 end
967
968 define nextcons
969 p $.u.cdr
970 xcons
971 end
972 document nextcons
973 Print the contents of the next cell in a list.
974 This command assumes that the last thing you printed was a cons cell contents
975 (type struct Lisp_Cons) or a pointer to one.
976 end
977 define xcar
978 xgetptr $
979 xgettype $
980 print/x ($type == Lisp_Cons ? ((struct Lisp_Cons *) $ptr)->car : 0)
981 end
982 document xcar
983 Assume that $ is an Emacs Lisp pair and print its car.
984 end
985
986 define xcdr
987 xgetptr $
988 xgettype $
989 print/x ($type == Lisp_Cons ? ((struct Lisp_Cons *) $ptr)->u.cdr : 0)
990 end
991 document xcdr
992 Assume that $ is an Emacs Lisp pair and print its cdr.
993 end
994
995 define xlist
996 xgetptr $
997 set $cons = (struct Lisp_Cons *) $ptr
998 xgetptr Qnil
999 set $nil = $ptr
1000 set $i = 0
1001 while $cons != $nil && $i < 10
1002 p/x $cons->car
1003 xpr
1004 xgetptr $cons->u.cdr
1005 set $cons = (struct Lisp_Cons *) $ptr
1006 set $i = $i + 1
1007 printf "---\n"
1008 end
1009 if $cons == $nil
1010 printf "nil\n"
1011 else
1012 printf "...\n"
1013 p $ptr
1014 end
1015 end
1016 document xlist
1017 Print $ assuming it is a list.
1018 end
1019
1020 define xfloat
1021 xgetptr $
1022 print ((struct Lisp_Float *) $ptr)->u.data
1023 end
1024 document xfloat
1025 Print $ assuming it is a lisp floating-point number.
1026 end
1027
1028 define xscrollbar
1029 xgetptr $
1030 print (struct scrollbar *) $ptr
1031 output *$
1032 echo \n
1033 end
1034 document xscrollbar
1035 Print $ as a scrollbar pointer.
1036 end
1037
1038 define xpr
1039 xtype
1040 if $type == Lisp_Int
1041 xint
1042 end
1043 if $type == Lisp_Symbol
1044 xsymbol
1045 end
1046 if $type == Lisp_String
1047 xstring
1048 end
1049 if $type == Lisp_Cons
1050 xcons
1051 end
1052 if $type == Lisp_Float
1053 xfloat
1054 end
1055 if $type == Lisp_Misc
1056 set $misc = (enum Lisp_Misc_Type) (((struct Lisp_Free *) $ptr)->type)
1057 if $misc == Lisp_Misc_Free
1058 xmiscfree
1059 end
1060 if $misc == Lisp_Misc_Boolfwd
1061 xboolfwd
1062 end
1063 if $misc == Lisp_Misc_Marker
1064 xmarker
1065 end
1066 if $misc == Lisp_Misc_Intfwd
1067 xintfwd
1068 end
1069 if $misc == Lisp_Misc_Boolfwd
1070 xboolfwd
1071 end
1072 if $misc == Lisp_Misc_Objfwd
1073 xobjfwd
1074 end
1075 if $misc == Lisp_Misc_Buffer_Objfwd
1076 xbufobjfwd
1077 end
1078 if $misc == Lisp_Misc_Buffer_Local_Value
1079 xbuflocal
1080 end
1081 # if $misc == Lisp_Misc_Some_Buffer_Local_Value
1082 # xvalue
1083 # end
1084 if $misc == Lisp_Misc_Overlay
1085 xoverlay
1086 end
1087 if $misc == Lisp_Misc_Kboard_Objfwd
1088 xkbobjfwd
1089 end
1090 # if $misc == Lisp_Misc_Save_Value
1091 # xsavevalue
1092 # end
1093 end
1094 if $type == Lisp_Vectorlike
1095 set $size = ((struct Lisp_Vector *) $ptr)->header.size
1096 if ($size & PVEC_FLAG)
1097 set $vec = (enum pvec_type) ($size & PVEC_TYPE_MASK)
1098 if $vec == PVEC_NORMAL_VECTOR
1099 xvector
1100 end
1101 if $vec == PVEC_PROCESS
1102 xprocess
1103 end
1104 if $vec == PVEC_FRAME
1105 xframe
1106 end
1107 if $vec == PVEC_COMPILED
1108 xcompiled
1109 end
1110 if $vec == PVEC_WINDOW
1111 xwindow
1112 end
1113 if $vec == PVEC_WINDOW_CONFIGURATION
1114 xwinconfig
1115 end
1116 if $vec == PVEC_SUBR
1117 xsubr
1118 end
1119 if $vec == PVEC_CHAR_TABLE
1120 xchartable
1121 end
1122 if $vec == PVEC_BOOL_VECTOR
1123 xboolvector
1124 end
1125 if $vec == PVEC_BUFFER
1126 xbuffer
1127 end
1128 if $vec == PVEC_HASH_TABLE
1129 xhashtable
1130 end
1131 else
1132 xvector
1133 end
1134 end
1135 end
1136 document xpr
1137 Print $ as a lisp object of any type.
1138 end
1139
1140 define xprintstr
1141 set $data = (char *) $arg0->data
1142 output ($arg0->size > 1000) ? 0 : ($data[0])@($arg0->size_byte < 0 ? $arg0->size & ~gdb_array_mark_flag : $arg0->size_byte)
1143 end
1144
1145 define xprintsym
1146 xgetptr $arg0
1147 set $sym = (struct Lisp_Symbol *) $ptr
1148 xgetptr $sym->xname
1149 set $sym_name = (struct Lisp_String *) $ptr
1150 xprintstr $sym_name
1151 end
1152 document xprintsym
1153 Print argument as a symbol.
1154 end
1155
1156 define xcoding
1157 set $tmp = (struct Lisp_Hash_Table *) ((Vcoding_system_hash_table & $valmask) | gdb_data_seg_bits)
1158 set $tmp = (struct Lisp_Vector *) (($tmp->key_and_value & $valmask) | gdb_data_seg_bits)
1159 set $name = $tmp->contents[$arg0 * 2]
1160 print $name
1161 pr
1162 print $tmp->contents[$arg0 * 2 + 1]
1163 pr
1164 end
1165 document xcoding
1166 Print the name and attributes of coding system that has ID (argument).
1167 end
1168
1169 define xcharset
1170 set $tmp = (struct Lisp_Hash_Table *) ((Vcharset_hash_table & $valmask) | gdb_data_seg_bits)
1171 set $tmp = (struct Lisp_Vector *) (($tmp->key_and_value & $valmask) | gdb_data_seg_bits)
1172 p $tmp->contents[charset_table[$arg0].hash_index * 2]
1173 pr
1174 end
1175 document xcharset
1176 Print the name of charset that has ID (argument).
1177 end
1178
1179 define xfontset
1180 xgetptr $
1181 set $tbl = (struct Lisp_Char_Table *) $ptr
1182 print $tbl
1183 xgetint $tbl->extras[0]
1184 printf " ID:%d", $int
1185 xgettype $tbl->extras[1]
1186 xgetptr $tbl->extras[1]
1187 if $type == Lisp_String
1188 set $ptr = (struct Lisp_String *) $ptr
1189 printf " Name:"
1190 xprintstr $ptr
1191 else
1192 xgetptr $tbl->extras[2]
1193 set $ptr = (struct Lisp_Char_Table *) $ptr
1194 xgetptr $ptr->extras[1]
1195 set $ptr = (struct Lisp_String *) $ptr
1196 printf " Realized from:"
1197 xprintstr $ptr
1198 end
1199 echo \n
1200 end
1201
1202 define xfont
1203 xgetptr $
1204 set $size = (((struct Lisp_Vector *) $ptr)->header.size & 0x1FF)
1205 if $size == FONT_SPEC_MAX
1206 print (struct font_spec *) $ptr
1207 else
1208 if $size == FONT_ENTITY_MAX
1209 print (struct font_entity *) $ptr
1210 else
1211 print (struct font *) $ptr
1212 end
1213 end
1214 end
1215 document xfont
1216 Print $ assuming it is a list font (font-spec, font-entity, or font-object).
1217 end
1218
1219 define xbacktrace
1220 set $bt = backtrace_list
1221 while $bt
1222 xgettype (*$bt->function)
1223 if $type == Lisp_Symbol
1224 xprintsym (*$bt->function)
1225 printf " (0x%x)\n", $bt->args
1226 else
1227 xgetptr *$bt->function
1228 printf "0x%x ", $ptr
1229 if $type == Lisp_Vectorlike
1230 xgetptr (*$bt->function)
1231 set $size = ((struct Lisp_Vector *) $ptr)->header.size
1232 output ($size & PVEC_FLAG) ? (enum pvec_type) ($size & PVEC_TYPE_MASK) : $size & ~gdb_array_mark_flag
1233 else
1234 printf "Lisp type %d", $type
1235 end
1236 echo \n
1237 end
1238 set $bt = $bt->next
1239 end
1240 end
1241 document xbacktrace
1242 Print a backtrace of Lisp function calls from backtrace_list.
1243 Set a breakpoint at Fsignal and call this to see from where
1244 an error was signaled.
1245 end
1246
1247 define xprintbytestr
1248 set $data = (char *) $arg0->data
1249 printf "Bytecode: "
1250 output/u ($arg0->size > 1000) ? 0 : ($data[0])@($arg0->size_byte < 0 ? $arg0->size & ~gdb_array_mark_flag : $arg0->size_byte)
1251 end
1252 document xprintbytestr
1253 Print a string of byte code.
1254 end
1255
1256 define xwhichsymbols
1257 set $output_debug = print_output_debug_flag
1258 set print_output_debug_flag = 0
1259 set safe_debug_print (which_symbols ($arg0, $arg1))
1260 set print_output_debug_flag = $output_debug
1261 end
1262 document xwhichsymbols
1263 Print symbols which references a given lisp object
1264 either as its symbol value or symbol function.
1265 Call with two arguments: the lisp object and the
1266 maximum number of symbols referencing it to produce.
1267 end
1268
1269 define xbytecode
1270 set $bt = byte_stack_list
1271 while $bt
1272 xgetptr $bt->byte_string
1273 set $ptr = (struct Lisp_String *) $ptr
1274 xprintbytestr $ptr
1275 printf "\n0x%x => ", $bt->byte_string
1276 xwhichsymbols $bt->byte_string 5
1277 set $bt = $bt->next
1278 end
1279 end
1280 document xbytecode
1281 Print a backtrace of the byte code stack.
1282 end
1283
1284 # Show Lisp backtrace after normal backtrace.
1285 define hookpost-backtrace
1286 set $bt = backtrace_list
1287 if $bt
1288 echo \n
1289 echo Lisp Backtrace:\n
1290 xbacktrace
1291 end
1292 end
1293
1294 define xreload
1295 set $tagmask = (((long)1 << gdb_gctypebits) - 1)
1296 set $valmask = gdb_use_lsb ? ~($tagmask) : ((long)1 << gdb_valbits) - 1
1297 end
1298 document xreload
1299 When starting Emacs a second time in the same gdb session under
1300 FreeBSD 2.2.5, gdb 4.13, $valmask have lost
1301 their values. (The same happens on current (2000) versions of GNU/Linux
1302 with gdb 5.0.)
1303 This function reloads them.
1304 end
1305 xreload
1306
1307 # Flush display (X only)
1308 define ff
1309 set x_flush (0)
1310 end
1311 document ff
1312 Flush pending X window display updates to screen.
1313 Works only when an inferior emacs is executing.
1314 end
1315
1316
1317 define hook-run
1318 xreload
1319 end
1320
1321 # Call xreload if a new Emacs executable is loaded.
1322 define hookpost-run
1323 xreload
1324 end
1325
1326 set print pretty on
1327 set print sevenbit-strings
1328
1329 show environment DISPLAY
1330 show environment TERM
1331
1332 # People get bothered when they see messages about non-existent functions...
1333 xgetptr globals.f_Vsystem_type
1334 # $ptr is NULL in temacs
1335 if ($ptr != 0)
1336 set $tem = (struct Lisp_Symbol *) $ptr
1337 xgetptr $tem->xname
1338 set $tem = (struct Lisp_String *) $ptr
1339 set $tem = (char *) $tem->data
1340
1341 # Don't let abort actually run, as it will make stdio stop working and
1342 # therefore the `pr' command above as well.
1343 if $tem[0] == 'w' && $tem[1] == 'i' && $tem[2] == 'n' && $tem[3] == 'd'
1344 # The windows-nt build replaces abort with its own function.
1345 break w32_abort
1346 else
1347 break abort
1348 end
1349 end
1350
1351 # x_error_quitter is defined only on X. But window-system is set up
1352 # only at run time, during Emacs startup, so we need to defer setting
1353 # the breakpoint. init_sys_modes is the first function called on
1354 # every platform after init_display, where window-system is set.
1355 tbreak init_sys_modes
1356 commands
1357 silent
1358 xgetptr globals.f_Vinitial_window_system
1359 set $tem = (struct Lisp_Symbol *) $ptr
1360 xgetptr $tem->xname
1361 set $tem = (struct Lisp_String *) $ptr
1362 set $tem = (char *) $tem->data
1363 # If we are running in synchronous mode, we want a chance to look
1364 # around before Emacs exits. Perhaps we should put the break
1365 # somewhere else instead...
1366 if $tem[0] == 'x' && $tem[1] == '\0'
1367 break x_error_quitter
1368 end
1369 continue
1370 end