Fix bug #10129: add positional information to "C-u C-x =".
[emacs.git] / src / .gdbinit
blobb60c14fe28980a2c892265c47df1bcaa9123b6f4
1 # Copyright (C) 1992-1998, 2000-2012  Free Software Foundation, Inc.
3 # This file is part of GNU Emacs.
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.
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.
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.
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
25 # Find lwlib source files too.
26 dir ../lwlib
27 #dir /gd/gnu/lesstif-0.89.9/lib/Xm
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
35 # Make it work like SIGINT normally does.
36 handle SIGTSTP nopass
38 # Pass on user signals
39 handle SIGUSR1 noprint pass
40 handle SIGUSR2 noprint pass
42 # Don't pass SIGALRM to Emacs.  This makes problems when
43 # debugging.
44 handle SIGALRM ignore
46 # $valmask and $tagmask are mask values set up by the xreload macro below.
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
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
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
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
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
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
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.
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
117 document pv
118 Print the value of the lisp variable given as argument.
119 Works only when an inferior emacs is executing.
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
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.
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
161 document ppt
162 Print current buffer's point and boundaries.
163 Prints values of point, beg, end, narrow, and gap for current buffer.
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
191 document pitmethod
192 Pretty print it->method given as first arg
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
297 document pitx
298 Pretty print a display iterator.
299 Take one arg, an iterator object or pointer.
302 define pit
303   pitx it
305 document pit
306 Pretty print the display iterator it.
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"
355 document prowx
356 Pretty print information about glyph_row.
357 Takes one argument, a row object or pointer.
360 define prow
361   prowx row
363 document prow
364 Pretty print information about glyph_row in row.
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
372 document pcursorx
373 Pretty print a window cursor.
376 define pcursor
377   printf "output: "
378   pcursorx output_cursor
379   printf "\n"
381 document pcursor
382 Pretty print the output_cursor.
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"
440 document pwinx
441 Pretty print a window structure.
442 Takes one argument, a pointer to a window structure.
445 define pwin
446   pwinx w
448 document pwin
449 Pretty print window structure w.
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
478 document pbiditype
479 Print textual description of bidi type given as first argument.
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"
565 document pgx
566 Pretty print a glyph structure.
567 Takes one argument, a pointer to a glyph structure.
570 define pg
571   set $pgidx = 0
572   pgx glyph
574 document pg
575 Pretty print glyph structure glyph.
578 define pgi
579   set $pgidx = $arg0
580   pgx (&glyph[$pgidx])
582 document pgi
583 Pretty print glyph structure glyph[I].
584 Takes one argument, a integer I.
587 define pgn
588   set $pgidx = $pgidx + 1
589   pgx (&glyph[$pgidx])
591 document pgn
592 Pretty print next glyph structure.
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
615 document pgrowx
616 Pretty print all glyphs in a row structure.
617 Takes one argument, a pointer to a row structure.
620 define pgrow
621   pgrowx row
623 document pgrow
624 Pretty print all glyphs in row structure row.
627 define pgrowit
628   pgrowx it->glyph_row
630 document pgrowit
631 Pretty print all glyphs in it->glyph_row.
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
637 document prowlims
638 Print important attributes of a glyph_row structure.
639 Takes one argument, a pointer to a glyph_row structure.
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
654 document pmtxrows
655 Print data about glyph rows in a glyph matrix.
656 Takes one argument, a pointer to a glyph_matrix structure.
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
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.
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
683 document xvectype
684 Print the size or vector subtype of $.
685 This command assumes that $ is a vector or pseudovector.
688 define xmisctype
689   xgetptr $
690   output (enum Lisp_Misc_Type) (((struct Lisp_Free *) $ptr)->type)
691   echo \n
693 document xmisctype
694 Assume that $ is some misc type and print its specific type.
697 define xint
698   xgetint $
699   print $int
701 document xint
702 Print $ as an Emacs Lisp integer.  This gets the sign right.
705 define xptr
706   xgetptr $
707   print (void *) $ptr
709 document xptr
710 Print the pointer portion of an Emacs Lisp value in $.
713 define xmarker
714   xgetptr $
715   print (struct Lisp_Marker *) $ptr
717 document xmarker
718 Print $ as a marker pointer.
719 This command assumes that $ is an Emacs Lisp marker value.
722 define xoverlay
723   xgetptr $
724   print (struct Lisp_Overlay *) $ptr
726 document xoverlay
727 Print $ as a overlay pointer.
728 This command assumes that $ is an Emacs Lisp overlay value.
731 define xmiscfree
732   xgetptr $
733   print (struct Lisp_Free *) $ptr
735 document xmiscfree
736 Print $ as a misc free-cell pointer.
737 This command assumes that $ is an Emacs Lisp Misc value.
740 define xintfwd
741   xgetptr $
742   print (struct Lisp_Intfwd *) $ptr
744 document xintfwd
745 Print $ as an integer forwarding pointer.
746 This command assumes that $ is an Emacs Lisp Misc value.
749 define xboolfwd
750   xgetptr $
751   print (struct Lisp_Boolfwd *) $ptr
753 document xboolfwd
754 Print $ as a boolean forwarding pointer.
755 This command assumes that $ is an Emacs Lisp Misc value.
758 define xobjfwd
759   xgetptr $
760   print (struct Lisp_Objfwd *) $ptr
762 document xobjfwd
763 Print $ as an object forwarding pointer.
764 This command assumes that $ is an Emacs Lisp Misc value.
767 define xbufobjfwd
768   xgetptr $
769   print (struct Lisp_Buffer_Objfwd *) $ptr
771 document xbufobjfwd
772 Print $ as a buffer-local object forwarding pointer.
773 This command assumes that $ is an Emacs Lisp Misc value.
776 define xkbobjfwd
777   xgetptr $
778   print (struct Lisp_Kboard_Objfwd *) $ptr
780 document xkbobjfwd
781 Print $ as a kboard-local object forwarding pointer.
782 This command assumes that $ is an Emacs Lisp Misc value.
785 define xbuflocal
786   xgetptr $
787   print (struct Lisp_Buffer_Local_Value *) $ptr
789 document xbuflocal
790 Print $ as a buffer-local-value pointer.
791 This command assumes that $ is an Emacs Lisp Misc value.
794 define xsymbol
795   set $sym = $
796   xgetptr $sym
797   print (struct Lisp_Symbol *) $ptr
798   xprintsym $sym
799   echo \n
801 document xsymbol
802 Print the name and address of the symbol $.
803 This command assumes that $ is an Emacs Lisp symbol value.
806 define xstring
807   xgetptr $
808   print (struct Lisp_String *) $ptr
809   xprintstr $
810   echo \n
812 document xstring
813 Print the contents and address of the string $.
814 This command assumes that $ is an Emacs Lisp string value.
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
823 document xvector
824 Print the contents and address of the vector $.
825 This command assumes that $ is an Emacs Lisp vector value.
828 define xprocess
829   xgetptr $
830   print (struct Lisp_Process *) $ptr
831   output *$
832   echo \n
834 document xprocess
835 Print the address of the struct Lisp_process to which $ points.
836 This command assumes that $ is a Lisp_Object.
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
847 document xframe
848 Print $ as a frame pointer.
849 This command assumes $ is an Emacs Lisp frame value.
852 define xcompiled
853   xgetptr $
854   print (struct Lisp_Vector *) $ptr
855   output ($->contents[0])@($->header.size & 0xff)
857 document xcompiled
858 Print $ as a compiled function pointer.
859 This command assumes that $ is an Emacs Lisp compiled value.
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
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".
881 define xwinconfig
882   xgetptr $
883   print (struct save_window_data *) $ptr
885 document xwinconfig
886 Print $ as a window configuration pointer.
887 This command assumes that $ is an Emacs Lisp window configuration value.
890 define xsubr
891   xgetptr $
892   print (struct Lisp_Subr *) $ptr
893   output *$
894   echo \n
896 document xsubr
897 Print the address of the subr which the Lisp_Object $ points to.
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
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.
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
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.
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
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.
937 define xbuffer
938   xgetptr $
939   print (struct buffer *) $ptr
940   xgetptr $->name_
941   output ((struct Lisp_String *) $ptr)->data
942   echo \n
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.
949 define xhashtable
950   xgetptr $
951   print (struct Lisp_Hash_Table *) $ptr
953 document xhashtable
954 Set $ as a hash table pointer.
955 This command assumes that $ is an Emacs Lisp hash table value.
958 define xcons
959   xgetptr $
960   print (struct Lisp_Cons *) $ptr
961   output/x *$
962   echo \n
964 document xcons
965 Print the contents of $ as an Emacs Lisp cons.
968 define nextcons
969   p $.u.cdr
970   xcons
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.
977 define xcar
978   xgetptr $
979   xgettype $
980   print/x ($type == Lisp_Cons ? ((struct Lisp_Cons *) $ptr)->car : 0)
982 document xcar
983 Assume that $ is an Emacs Lisp pair and print its car.
986 define xcdr
987   xgetptr $
988   xgettype $
989   print/x ($type == Lisp_Cons ? ((struct Lisp_Cons *) $ptr)->u.cdr : 0)
991 document xcdr
992 Assume that $ is an Emacs Lisp pair and print its cdr.
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
1016 document xlist
1017 Print $ assuming it is a list.
1020 define xfloat
1021   xgetptr $
1022   print ((struct Lisp_Float *) $ptr)->u.data
1024 document xfloat
1025 Print $ assuming it is a lisp floating-point number.
1028 define xscrollbar
1029   xgetptr $
1030   print (struct scrollbar *) $ptr
1031 output *$
1032 echo \n
1034 document xscrollbar
1035 Print $ as a scrollbar pointer.
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
1136 document xpr
1137 Print $ as a lisp object of any type.
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)
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
1152 document xprintsym
1153   Print argument as a symbol.
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
1165 document xcoding
1166   Print the name and attributes of coding system that has ID (argument).
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
1175 document xcharset
1176   Print the name of charset that has ID (argument).
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
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
1215 document xfont
1216 Print $ assuming it is a list font (font-spec, font-entity, or font-object).
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
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.
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)
1252 document xprintbytestr
1253   Print a string of byte code.
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
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.
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
1280 document xbytecode
1281   Print a backtrace of the byte code stack.
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
1294 define xreload
1295   set $tagmask = (((long)1 << gdb_gctypebits) - 1)
1296   set $valmask = gdb_use_lsb ? ~($tagmask) : ((long)1 << gdb_valbits) - 1
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.
1305 xreload
1307 # Flush display (X only)
1308 define ff
1309   set x_flush (0)
1311 document ff
1312 Flush pending X window display updates to screen.
1313 Works only when an inferior emacs is executing.
1317 define hook-run
1318   xreload
1321 # Call xreload if a new Emacs executable is loaded.
1322 define hookpost-run
1323   xreload
1326 set print pretty on
1327 set print sevenbit-strings
1329 show environment DISPLAY
1330 show environment TERM
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
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
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