1 # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2001,
2 # 2002, 2003, 2004, 2005, 2006, 2007, 2008
3 # Free Software Foundation, Inc.
5 # This file is part of GNU Emacs.
7 # GNU Emacs is free software; you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 3, or (at your option)
12 # GNU Emacs is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
17 # You should have received a copy of the GNU General Public License
18 # along with GNU Emacs; see the file COPYING. If not, write to the
19 # Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20 # Boston, MA 02110-1301, USA.
22 # Force loading of symbols, enough to give us gdb_valbits etc.
25 # Find lwlib source files too.
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.
35 # Make it work like SIGINT normally does.
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
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.
52 set $ptr = (gdb_use_union ? $bugfix.u.val : $bugfix & $valmask) | gdb_data_seg_bits
57 set $int = gdb_use_union ? $bugfix.s.val : (gdb_use_lsb ? $bugfix : $bugfix << gdb_gctypebits) >> gdb_gctypebits
62 set $type = gdb_use_union ? $bugfix.s.type : (enum Lisp_Type) (gdb_use_lsb ? $bugfix & $tagmask : $bugfix >> gdb_valbits)
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!).
70 set $output_debug = print_output_debug_flag
71 set print_output_debug_flag = 0
73 set print_output_debug_flag = $output_debug
76 Print the emacs s-expression which is $.
77 Works only when an inferior emacs is executing.
80 # Print out s-expressions
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
89 Print the argument as an emacs s-expression
90 Works only when an inferior emacs is executing.
93 # Print out s-expressions from tool bar
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
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
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
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
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
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
139 set $b = current_buffer
141 printf "BUF PT: %d", $b->pt
142 if ($b->pt != $b->pt_byte)
143 printf "[%d]", $b->pt_byte
145 printf " of 1..%d", $t->z
146 if ($t->z != $t->z_byte)
147 printf "[%d]", $t->z_byte
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
155 printf " GAP: %d", $t->gpt
156 if ($t->gpt != $t->gpt_byte)
157 printf "[%d]", $t->gpt_byte
159 printf " SZ=%d\n", $t->gap_size
162 Print current buffer's point and boundaries.
163 Prints values of point, beg, end, narrow, and gap for current buffer.
166 # Print out iterator given as first arg
169 printf "cur=%d", $it->current.pos.charpos
170 if ($it->current.pos.charpos != $it->current.pos.bytepos)
171 printf "[%d]", $it->current.pos.bytepos
173 printf " pos=%d", $it->position.charpos
174 if ($it->position.charpos != $it->position.bytepos)
175 printf "[%d]", $it->position.bytepos
177 printf " start=%d", $it->start.pos.charpos
178 if ($it->start.pos.charpos != $it->start.pos.bytepos)
179 printf "[%d]", $it->start.pos.bytepos
181 printf " end=%d", $it->end_charpos
182 printf " stop=%d", $it->stop_charpos
183 printf " face=%d", $it->face_id
184 if ($it->multibyte_p)
187 if ($it->header_line_p)
190 if ($it->n_overlay_strings > 0)
191 printf " nov=%d", $it->n_overlay_strings
194 printf " sp=%d", $it->sp
196 if ($it->what == IT_CHARACTER)
197 if ($it->len == 1 && $it->c >= ' ' && it->c < 255)
198 printf " ch='%c'", $it->c
200 printf " ch=[%d,%d]", $it->c, $it->len
206 if ($it->method != GET_FROM_BUFFER)
209 if ($it->method == GET_FROM_STRING)
210 printf "[%d]", $it->current.string_pos.charpos
212 if ($it->method == GET_FROM_IMAGE)
213 printf "[%d]", $it->image_id
215 if ($it->method == GET_FROM_COMPOSITION)
216 printf "[%d,%d,%d]", $it->cmp_id, $it->len, $it->cmp_len
220 if ($it->region_beg_charpos >= 0)
221 printf "reg=%d-%d ", $it->region_beg_charpos, $it->region_end_charpos
223 printf "vpos=%d hpos=%d", $it->vpos, $it->hpos,
224 printf " y=%d lvy=%d", $it->current_y, $it->last_visible_y
225 printf " x=%d vx=%d-%d", $it->current_x, $it->first_visible_x, $it->last_visible_x
226 printf " w=%d", $it->pixel_width
227 printf " a+d=%d+%d=%d", $it->ascent, $it->descent, $it->ascent+$it->descent
228 printf " max=%d+%d=%d", $it->max_ascent, $it->max_descent, $it->max_ascent+$it->max_descent
231 while ($i < $it->sp && $i < 4)
232 set $e = $it->stack[$i]
233 printf "stack[%d]: ", $i
235 printf "[%d]", $e->position.charpos
241 Pretty print a display iterator.
242 Take one arg, an iterator object or pointer.
249 Pretty print the display iterator it.
254 printf "y=%d x=%d pwid=%d", $row->y, $row->x, $row->pixel_width
255 printf " a+d=%d+%d=%d", $row->ascent, $row->height-$row->ascent, $row->height
256 printf " phys=%d+%d=%d", $row->phys_ascent, $row->phys_height-$row->phys_ascent, $row->phys_height
257 printf " vis=%d", $row->visible_height
258 printf " L=%d T=%d R=%d", $row->used[0], $row->used[1], $row->used[2]
260 printf "start=%d end=%d", $row->start.pos.charpos, $row->end.pos.charpos
264 if ($row->displays_text_p)
267 if ($row->mode_line_p)
270 if ($row->continued_p)
273 if ($row-> truncated_on_left_p)
276 if ($row-> truncated_on_right_p)
279 if ($row->starts_in_middle_of_char_p)
282 if ($row->ends_in_middle_of_char_p)
285 if ($row->ends_in_newline_from_string_p)
288 if ($row->ends_at_zv_p)
291 if ($row->overlapped_p)
294 if ($row->overlapping_p)
300 Pretty print information about glyph_row.
301 Takes one argument, a row object or pointer.
308 Pretty print information about glyph_row in row.
314 printf "y=%d x=%d vpos=%d hpos=%d", $cp->y, $cp->x, $cp->vpos, $cp->hpos
317 Pretty print a window cursor.
322 pcursorx output_cursor
326 Pretty print the output_cursor.
331 xgetint $w->sequence_number
332 if ($w->mini_p != Qnil)
335 printf "Window %d ", $int
337 set $tem = (struct buffer *) $ptr
339 printf "%s", ((struct Lisp_String *) $ptr)->data
342 set $tem = (struct Lisp_Marker *) $ptr
343 printf "start=%d end:", $tem->charpos
344 if ($w->window_end_valid != Qnil)
345 xgetint $w->window_end_pos
346 printf "pos=%d", $int
347 xgetint $w->window_end_vpos
348 printf " vpos=%d", $int
352 printf " vscroll=%d", $w->vscroll
353 if ($w->force_start != Qnil)
354 printf " FORCE_START"
356 if ($w->must_be_updated_p)
363 pcursorx $w->phys_cursor
364 if ($w->phys_cursor_on_p)
370 if ($w->last_cursor_off_p != $w->cursor_off_p)
371 if ($w->last_cursor_off_p)
377 if ($w->cursor_off_p)
385 Pretty print a window structure.
386 Takes one argument, a pointer to a window structure.
393 Pretty print window structure w.
398 if ($g->type == CHAR_GLYPH)
399 if ($g->u.ch >= ' ' && $g->u.ch < 127)
400 printf "CHAR[%c]", $g->u.ch
402 printf "CHAR[0x%x]", $g->u.ch
405 if ($g->type == COMPOSITE_GLYPH)
406 printf "COMP[%d]", $g->u.cmp_id
408 if ($g->type == IMAGE_GLYPH)
409 printf "IMAGE[%d]", $g->u.img_id
411 if ($g->type == STRETCH_GLYPH)
412 printf "STRETCH[%d+%d]", $g->u.stretch.height, $g->u.stretch.ascent
414 xgettype ($g->object)
415 if ($type == Lisp_String)
416 printf " str=%x[%d]", $g->object, $g->charpos
418 printf " pos=%d", $g->charpos
420 printf " w=%d a+d=%d+%d", $g->pixel_width, $g->ascent, $g->descent
421 if ($g->face_id != DEFAULT_FACE_ID)
422 printf " face=%d", $g->face_id
425 printf " vof=%d", $g->voffset
433 if ($g->glyph_not_available_p)
436 if ($g->overlaps_vertically_p)
439 if ($g->left_box_line_p)
442 if ($g->right_box_line_p)
445 if ($g->slice.x || $g->slice.y || $g->slice.width || $g->slice.height)
446 printf " slice=%d,%d,%d,%d" ,$g->slice.x, $g->slice.y, $g->slice.width, $g->slice.height
451 Pretty print a glyph structure.
452 Takes one argument, a pointer to a glyph structure.
460 Pretty print glyph structure glyph.
468 Pretty print glyph structure glyph[I].
469 Takes one argument, a integer I.
473 set $pgidx = $pgidx + 1
477 Pretty print next glyph structure.
485 set $used = $row->used[$area]
487 set $gl0 = $row->glyphs[$area]
489 printf "%s: %d glyphs\n", ($area == 0 ? "LEFT" : $area == 2 ? "RIGHT" : "TEXT"), $used
490 while ($pgidx < $used)
491 printf "%3d %4d: ", $pgidx, $xofs
493 set $xofs = $xofs + $gl0[$pgidx]->pixel_width
494 set $pgidx = $pgidx + 1
497 set $area = $area + 1
501 Pretty print all glyphs in a row structure.
502 Takes one argument, a pointer to a row structure.
509 Pretty print all glyphs in row structure row.
516 if $type == Lisp_Misc
519 if $type == Lisp_Vectorlike
525 Print the type of $, assuming it is an Emacs Lisp value.
526 If the first type printed is Lisp_Vector or Lisp_Misc,
527 a second line gives the more precise type.
532 set $size = ((struct Lisp_Vector *) $ptr)->size
533 output ($size & PVEC_FLAG) ? (enum pvec_type) ($size & PVEC_TYPE_MASK) : $size & ~gdb_array_mark_flag
537 Print the size or vector subtype of $.
538 This command assumes that $ is a vector or pseudovector.
543 output (enum Lisp_Misc_Type) (((struct Lisp_Free *) $ptr)->type)
547 Assume that $ is some misc type and print its specific type.
555 Print $ as an Emacs Lisp integer. This gets the sign right.
563 Print the pointer portion of an Emacs Lisp value in $.
568 print (struct Lisp_Marker *) $ptr
571 Print $ as a marker pointer.
572 This command assumes that $ is an Emacs Lisp marker value.
577 print (struct Lisp_Overlay *) $ptr
580 Print $ as a overlay pointer.
581 This command assumes that $ is an Emacs Lisp overlay value.
586 print (struct Lisp_Free *) $ptr
589 Print $ as a misc free-cell pointer.
590 This command assumes that $ is an Emacs Lisp Misc value.
595 print (struct Lisp_Intfwd *) $ptr
598 Print $ as an integer forwarding pointer.
599 This command assumes that $ is an Emacs Lisp Misc value.
604 print (struct Lisp_Boolfwd *) $ptr
607 Print $ as a boolean forwarding pointer.
608 This command assumes that $ is an Emacs Lisp Misc value.
613 print (struct Lisp_Objfwd *) $ptr
616 Print $ as an object forwarding pointer.
617 This command assumes that $ is an Emacs Lisp Misc value.
622 print (struct Lisp_Buffer_Objfwd *) $ptr
625 Print $ as a buffer-local object forwarding pointer.
626 This command assumes that $ is an Emacs Lisp Misc value.
631 print (struct Lisp_Kboard_Objfwd *) $ptr
634 Print $ as a kboard-local object forwarding pointer.
635 This command assumes that $ is an Emacs Lisp Misc value.
640 print (struct Lisp_Buffer_Local_Value *) $ptr
643 Print $ as a buffer-local-value pointer.
644 This command assumes that $ is an Emacs Lisp Misc value.
650 print (struct Lisp_Symbol *) $ptr
655 Print the name and address of the symbol $.
656 This command assumes that $ is an Emacs Lisp symbol value.
661 print (struct Lisp_String *) $ptr
666 Print the contents and address of the string $.
667 This command assumes that $ is an Emacs Lisp string value.
672 print (struct Lisp_Vector *) $ptr
673 output ($->size > 50) ? 0 : ($->contents[0])@($->size & ~gdb_array_mark_flag)
677 Print the contents and address of the vector $.
678 This command assumes that $ is an Emacs Lisp vector value.
683 print (struct Lisp_Process *) $ptr
688 Print the address of the struct Lisp_process to which $ points.
689 This command assumes that $ is a Lisp_Object.
694 print (struct frame *) $ptr
696 set $ptr = (struct Lisp_String *) $ptr
701 Print $ as a frame pointer.
702 This command assumes $ is an Emacs Lisp frame value.
707 print (struct Lisp_Vector *) $ptr
708 output ($->contents[0])@($->size & 0xff)
711 Print $ as a compiled function pointer.
712 This command assumes that $ is an Emacs Lisp compiled value.
717 print (struct window *) $ptr
718 set $window = (struct window *) $ptr
719 xgetint $window->total_cols
721 xgetint $window->total_lines
723 xgetint $window->left_col
725 xgetint $window->top_line
727 printf "%dx%d+%d+%d\n", $width, $height, $left, $top
730 Print $ as a window pointer, assuming it is an Emacs Lisp window value.
731 Print the window's position as "WIDTHxHEIGHT+LEFT+TOP".
736 print (struct save_window_data *) $ptr
739 Print $ as a window configuration pointer.
740 This command assumes that $ is an Emacs Lisp window configuration value.
745 print (struct Lisp_Subr *) $ptr
750 Print the address of the subr which the Lisp_Object $ points to.
755 print (struct Lisp_Char_Table *) $ptr
758 printf " %d extra slots", ($->size & 0x1ff) - 388
762 Print the address of the char-table $, and its purpose.
763 This command assumes that $ is an Emacs Lisp char-table value.
768 print (struct Lisp_Bool_Vector *) $ptr
769 output ($->size > 256) ? 0 : ($->data[0])@((($->size & ~gdb_array_mark_flag) + 7)/ 8)
773 Print the contents and address of the bool-vector $.
774 This command assumes that $ is an Emacs Lisp bool-vector value.
779 print (struct buffer *) $ptr
781 output ((struct Lisp_String *) $ptr)->data
785 Set $ as a buffer pointer and the name of the buffer.
786 This command assumes $ is an Emacs Lisp buffer value.
791 print (struct Lisp_Hash_Table *) $ptr
794 Set $ as a hash table pointer.
795 This command assumes that $ is an Emacs Lisp hash table value.
800 print (struct Lisp_Cons *) $ptr
805 Print the contents of $ as an Emacs Lisp cons.
813 Print the contents of the next cell in a list.
814 This command assumes that the last thing you printed was a cons cell contents
815 (type struct Lisp_Cons) or a pointer to one.
820 print/x ($type == Lisp_Cons ? ((struct Lisp_Cons *) $ptr)->car : 0)
823 Assume that $ is an Emacs Lisp pair and print its car.
829 print/x ($type == Lisp_Cons ? ((struct Lisp_Cons *) $ptr)->u.cdr : 0)
832 Assume that $ is an Emacs Lisp pair and print its cdr.
837 set $cons = (struct Lisp_Cons *) $ptr
841 while $cons != $nil && $i < 10
845 set $cons = (struct Lisp_Cons *) $ptr
857 Print $ assuming it is a list.
862 print ((struct Lisp_Float *) $ptr)->u.data
865 Print $ assuming it is a lisp floating-point number.
870 print (struct scrollbar *) $ptr
875 Print $ as a scrollbar pointer.
883 if $type == Lisp_Symbol
886 if $type == Lisp_String
889 if $type == Lisp_Cons
892 if $type == Lisp_Float
895 if $type == Lisp_Misc
896 set $misc = (enum Lisp_Misc_Type) (((struct Lisp_Free *) $ptr)->type)
897 if $misc == Lisp_Misc_Free
900 if $misc == Lisp_Misc_Boolfwd
903 if $misc == Lisp_Misc_Marker
906 if $misc == Lisp_Misc_Intfwd
909 if $misc == Lisp_Misc_Boolfwd
912 if $misc == Lisp_Misc_Objfwd
915 if $misc == Lisp_Misc_Buffer_Objfwd
918 if $misc == Lisp_Misc_Buffer_Local_Value
921 # if $misc == Lisp_Misc_Some_Buffer_Local_Value
924 if $misc == Lisp_Misc_Overlay
927 if $misc == Lisp_Misc_Kboard_Objfwd
930 # if $misc == Lisp_Misc_Save_Value
934 if $type == Lisp_Vectorlike
935 set $size = ((struct Lisp_Vector *) $ptr)->size
936 if ($size & PVEC_FLAG)
937 set $vec = (enum pvec_type) ($size & PVEC_TYPE_MASK)
938 if $vec == PVEC_NORMAL_VECTOR
941 if $vec == PVEC_PROCESS
944 if $vec == PVEC_FRAME
947 if $vec == PVEC_COMPILED
950 if $vec == PVEC_WINDOW
953 if $vec == PVEC_WINDOW_CONFIGURATION
959 if $vec == PVEC_CHAR_TABLE
962 if $vec == PVEC_BOOL_VECTOR
965 if $vec == PVEC_BUFFER
968 if $vec == PVEC_HASH_TABLE
977 Print $ as a lisp object of any type.
981 set $data = (char *) $arg0->data
982 output ($arg0->size > 1000) ? 0 : ($data[0])@($arg0->size_byte < 0 ? $arg0->size & ~gdb_array_mark_flag : $arg0->size_byte)
987 set $sym = (struct Lisp_Symbol *) $ptr
989 set $sym_name = (struct Lisp_String *) $ptr
993 Print argument as a symbol.
997 set $bt = backtrace_list
999 xgettype (*$bt->function)
1000 if $type == Lisp_Symbol
1001 xprintsym (*$bt->function)
1002 printf " (0x%x)\n", *$bt->args
1004 printf "0x%x ", *$bt->function
1005 if $type == Lisp_Vectorlike
1006 xgetptr (*$bt->function)
1007 set $size = ((struct Lisp_Vector *) $ptr)->size
1008 output ($size & PVEC_FLAG) ? (enum pvec_type) ($size & PVEC_TYPE_MASK) : $size & ~gdb_array_mark_flag
1010 printf "Lisp type %d", $type
1018 Print a backtrace of Lisp function calls from backtrace_list.
1019 Set a breakpoint at Fsignal and call this to see from where
1020 an error was signaled.
1024 set debug_print (which_symbols ($arg0))
1027 Print symbols which references a given lisp object
1028 either as its symbol value or symbol function.
1032 set $bt = byte_stack_list
1034 xgettype ($bt->byte_string)
1035 printf "0x%x => ", $bt->byte_string
1036 which $bt->byte_string
1041 Print a backtrace of the byte code stack.
1044 # Show Lisp backtrace after normal backtrace.
1045 define hookpost-backtrace
1046 set $bt = backtrace_list
1049 echo Lisp Backtrace:\n
1055 set $tagmask = (((long)1 << gdb_gctypebits) - 1)
1056 set $valmask = gdb_use_lsb ? ~($tagmask) : ((long)1 << gdb_valbits) - 1
1059 When starting Emacs a second time in the same gdb session under
1060 FreeBSD 2.2.5, gdb 4.13, $valmask have lost
1061 their values. (The same happens on current (2000) versions of GNU/Linux
1063 This function reloads them.
1067 # Flush display (X only)
1072 Flush pending X window display updates to screen.
1073 Works only when an inferior emacs is executing.
1081 # Call xreload if a new Emacs executable is loaded.
1087 set print sevenbit-strings
1089 show environment DISPLAY
1090 show environment TERM
1091 set args -geometry 80x40+0+0
1093 # People get bothered when they see messages about non-existent functions...
1094 xgetptr Vsystem_type
1095 # $ptr is NULL in temacs
1097 set $tem = (struct Lisp_Symbol *) $ptr
1099 set $tem = (struct Lisp_String *) $ptr
1100 set $tem = (char *) $tem->data
1102 # Don't let abort actually run, as it will make stdio stop working and
1103 # therefore the `pr' command above as well.
1104 if $tem[0] == 'w' && $tem[1] == 'i' && $tem[2] == 'n' && $tem[3] == 'd'
1105 # The windows-nt build replaces abort with its own function.
1112 # x_error_quitter is defined only on X. But window-system is set up
1113 # only at run time, during Emacs startup, so we need to defer setting
1114 # the breakpoint. init_sys_modes is the first function called on
1115 # every platform after init_display, where window-system is set.
1116 tbreak init_sys_modes
1119 xgetptr Vwindow_system
1120 set $tem = (struct Lisp_Symbol *) $ptr
1122 set $tem = (struct Lisp_String *) $ptr
1123 set $tem = (char *) $tem->data
1124 # If we are running in synchronous mode, we want a chance to look
1125 # around before Emacs exits. Perhaps we should put the break
1126 # somewhere else instead...
1127 if $tem[0] == 'x' && $tem[1] == '\0'
1128 break x_error_quitter
1132 # arch-tag: 12f34321-7bfa-4240-b77a-3cd3a1696dfe