1 # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2001,
2 # 2004, 2005, 2006 Free Software Foundation, Inc.
4 # This file is part of GNU Emacs.
6 # GNU Emacs is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; either version 2, or (at your option)
11 # GNU Emacs is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with GNU Emacs; see the file COPYING. If not, write to the
18 # Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19 # Boston, MA 02110-1301, USA.
21 # Force loading of symbols, enough to give us gdb_valbits etc.
24 # Find lwlib source files too.
26 #dir /gd/gnu/lesstif-0.89.9/lib/Xm
28 # Don't enter GDB when user types C-g to quit.
29 # This has one unfortunate effect: you can't type C-c
30 # at the GDB to stop Emacs, when using X.
31 # However, C-z works just as well in that case.
34 # Make it work like SIGINT normally does.
37 # Don't pass SIGALRM to Emacs. This makes problems when
41 # $valmask and $tagmask are mask values set up by the xreload macro below.
43 # Use $bugfix so that the value isn't a constant.
44 # Using a constant runs into GDB bugs sometimes.
47 set $ptr = (gdb_use_union ? $bugfix.u.val : $bugfix & $valmask) | gdb_data_seg_bits
52 set $int = gdb_use_union ? $bugfix.s.val : (gdb_use_lsb ? $bugfix : $bugfix << gdb_gctypebits) >> gdb_gctypebits
57 set $type = gdb_use_union ? $bugfix.s.type : (enum Lisp_Type) (gdb_use_lsb ? $bugfix & $tagmask : $bugfix >> gdb_valbits)
60 # Set up something to print out s-expressions.
61 # We save and restore print_output_debug_flag to prevent the w32 port
62 # from calling OutputDebugString, which causes GDB to display each
63 # character twice (yuk!).
65 set $output_debug = print_output_debug_flag
66 set print_output_debug_flag = 0
68 set print_output_debug_flag = $output_debug
71 Print the emacs s-expression which is $.
72 Works only when an inferior emacs is executing.
75 # Print out s-expressions
78 set $output_debug = print_output_debug_flag
79 set print_output_debug_flag = 0
80 set safe_debug_print ($tmp)
81 set print_output_debug_flag = $output_debug
84 Print the argument as an emacs s-expression
85 Works only when an inferior emacs is executing.
88 # Print out s-expressions from tool bar
91 set $output_debug = print_output_debug_flag
92 set print_output_debug_flag = 0
93 set safe_debug_print ($tmp)
94 set print_output_debug_flag = $output_debug
97 Print the argument as an emacs s-expression.
98 Works only when an inferior emacs is executing.
99 For use on tool bar when debugging in Emacs
100 where the variable name would not otherwise
101 be recorded in the GUD buffer.
104 # Print value of lisp variable
107 set $output_debug = print_output_debug_flag
108 set print_output_debug_flag = 0
109 set safe_debug_print ( find_symbol_value (intern ($tmp)))
110 set print_output_debug_flag = $output_debug
113 Print the value of the lisp variable given as argument.
114 Works only when an inferior emacs is executing.
117 # Print value of lisp variable
120 set $output_debug = print_output_debug_flag
121 set print_output_debug_flag = 0
122 set safe_debug_print (find_symbol_value (intern ($tmp)))
123 set print_output_debug_flag = $output_debug
126 Print the value of the lisp variable given as argument.
127 Works only when an inferior emacs is executing.
128 For use when debugging in Emacs where the variable
129 name would not otherwise be recorded in the GUD buffer.
132 # Print out current buffer point and boundaries
134 set $b = current_buffer
136 printf "BUF PT: %d", $b->pt
137 if ($b->pt != $b->pt_byte)
138 printf "[%d]", $b->pt_byte
140 printf " of 1..%d", $t->z
141 if ($t->z != $t->z_byte)
142 printf "[%d]", $t->z_byte
144 if ($b->begv != 1 || $b->zv != $t->z)
145 printf " NARROW=%d..%d", $b->begv, $b->zv
146 if ($b->begv != $b->begv_byte || $b->zv != $b->zv_byte)
147 printf " [%d..%d]", $b->begv_byte, $b->zv_byte
150 printf " GAP: %d", $t->gpt
151 if ($t->gpt != $t->gpt_byte)
152 printf "[%d]", $t->gpt_byte
154 printf " SZ=%d\n", $t->gap_size
157 Print point, beg, end, narrow, and gap for current buffer.
160 # Print out iterator given as first arg
163 printf "cur=%d", $it->current.pos.charpos
164 if ($it->current.pos.charpos != $it->current.pos.bytepos)
165 printf "[%d]", $it->current.pos.bytepos
167 printf " pos=%d", $it->position.charpos
168 if ($it->position.charpos != $it->position.bytepos)
169 printf "[%d]", $it->position.bytepos
171 printf " start=%d", $it->start.pos.charpos
172 if ($it->start.pos.charpos != $it->start.pos.bytepos)
173 printf "[%d]", $it->start.pos.bytepos
175 printf " end=%d", $it->end_charpos
176 printf " stop=%d", $it->stop_charpos
177 printf " face=%d", $it->face_id
178 if ($it->multibyte_p)
181 if ($it->header_line_p)
184 if ($it->n_overlay_strings > 0)
185 printf " nov=%d", $it->n_overlay_strings
188 printf " sp=%d", $it->sp
190 if ($it->what == IT_CHARACTER)
191 if ($it->len == 1 && $it->c >= ' ' && it->c < 255)
192 printf " ch='%c'", $it->c
194 printf " ch=[%d,%d]", $it->c, $it->len
200 if ($it->method != GET_FROM_BUFFER)
203 if ($it->method == GET_FROM_STRING)
204 printf "[%d]", $it->current.string_pos.charpos
206 if ($it->method == GET_FROM_IMAGE)
207 printf "[%d]", $it->image_id
209 if ($it->method == GET_FROM_COMPOSITION)
210 printf "[%d,%d,%d]", $it->cmp_id, $it->len, $it->cmp_len
214 if ($it->region_beg_charpos >= 0)
215 printf "reg=%d-%d ", $it->region_beg_charpos, $it->region_end_charpos
217 printf "vpos=%d hpos=%d", $it->vpos, $it->hpos,
218 printf " y=%d lvy=%d", $it->current_y, $it->last_visible_y
219 printf " x=%d vx=%d-%d", $it->current_x, $it->first_visible_x, $it->last_visible_x
220 printf " w=%d", $it->pixel_width
221 printf " a+d=%d+%d=%d", $it->ascent, $it->descent, $it->ascent+$it->descent
222 printf " max=%d+%d=%d", $it->max_ascent, $it->max_descent, $it->max_ascent+$it->max_descent
225 while ($i < $it->sp && $i < 4)
226 set $e = $it->stack[$i]
227 printf "stack[%d]: ", $i
229 printf "[%d]", $e->position.charpos
235 Pretty print a display iterator.
236 Take one arg, an iterator object or pointer.
243 Pretty print the display iterator it.
248 printf "y=%d x=%d pwid=%d", $row->y, $row->x, $row->pixel_width
249 printf " a+d=%d+%d=%d", $row->ascent, $row->height-$row->ascent, $row->height
250 printf " phys=%d+%d=%d", $row->phys_ascent, $row->phys_height-$row->phys_ascent, $row->phys_height
251 printf " vis=%d", $row->visible_height
252 printf " L=%d T=%d R=%d", $row->used[0], $row->used[1], $row->used[2]
254 printf "start=%d end=%d", $row->start.pos.charpos, $row->end.pos.charpos
258 if ($row->displays_text_p)
261 if ($row->mode_line_p)
264 if ($row->continued_p)
267 if ($row-> truncated_on_left_p)
270 if ($row-> truncated_on_right_p)
273 if ($row->starts_in_middle_of_char_p)
276 if ($row->ends_in_middle_of_char_p)
279 if ($row->ends_in_newline_from_string_p)
282 if ($row->ends_at_zv_p)
285 if ($row->overlapped_p)
288 if ($row->overlapping_p)
294 Pretty print information about glyph_row.
295 Takes one argument, a row object or pointer.
302 Pretty print information about glyph_row in row.
308 printf "y=%d x=%d vpos=%d hpos=%d", $cp->y, $cp->x, $cp->vpos, $cp->hpos
311 Pretty print a window cursor
316 pcursorx output_cursor
320 Pretty print the output_cursor
325 xgetint $w->sequence_number
326 if ($w->mini_p != Qnil)
329 printf "Window %d ", $int
331 set $tem = (struct buffer *) $ptr
333 printf "%s", ((struct Lisp_String *) $ptr)->data
336 set $tem = (struct Lisp_Marker *) $ptr
337 printf "start=%d end:", $tem->charpos
338 if ($w->window_end_valid != Qnil)
339 xgetint $w->window_end_pos
340 printf "pos=%d", $int
341 xgetint $w->window_end_vpos
342 printf " vpos=%d", $int
346 printf " vscroll=%d", $w->vscroll
347 if ($w->force_start != Qnil)
348 printf " FORCE_START"
350 if ($w->must_be_updated_p)
357 pcursorx $w->phys_cursor
358 if ($w->phys_cursor_on_p)
364 if ($w->last_cursor_off_p != $w->cursor_off_p)
365 if ($w->last_cursor_off_p)
371 if ($w->cursor_off_p)
379 Pretty print a window structure.
380 Takes one argument, a pointer to a window structure
387 Pretty print window structure w.
392 if ($g->type == CHAR_GLYPH)
393 if ($g->u.ch >= ' ' && $g->u.ch < 127)
394 printf "CHAR[%c]", $g->u.ch
396 printf "CHAR[0x%x]", $g->u.ch
399 if ($g->type == COMPOSITE_GLYPH)
400 printf "COMP[%d]", $g->u.cmp_id
402 if ($g->type == IMAGE_GLYPH)
403 printf "IMAGE[%d]", $g->u.img_id
405 if ($g->type == STRETCH_GLYPH)
406 printf "STRETCH[%d+%d]", $g->u.stretch.height, $g->u.stretch.ascent
408 xgettype ($g->object)
409 if ($type == Lisp_String)
410 printf " str=%x[%d]", $g->object, $g->charpos
412 printf " pos=%d", $g->charpos
414 printf " w=%d a+d=%d+%d", $g->pixel_width, $g->ascent, $g->descent
415 if ($g->face_id != DEFAULT_FACE_ID)
416 printf " face=%d", $g->face_id
419 printf " vof=%d", $g->voffset
427 if ($g->glyph_not_available_p)
430 if ($g->overlaps_vertically_p)
433 if ($g->left_box_line_p)
436 if ($g->right_box_line_p)
439 if ($g->slice.x || $g->slice.y || $g->slice.width || $g->slice.height)
440 printf " slice=%d,%d,%d,%d" ,$g->slice.x, $g->slice.y, $g->slice.width, $g->slice.height
445 Pretty print a glyph structure.
446 Takes one argument, a pointer to a glyph structure
454 Pretty print glyph structure glyph.
462 Pretty print glyph structure glyph[I].
463 Takes one argument, a integer I.
467 set $pgidx = $pgidx + 1
471 Pretty print next glyph structure.
479 set $used = $row->used[$area]
481 set $gl0 = $row->glyphs[$area]
483 printf "%s: %d glyphs\n", ($area == 0 ? "LEFT" : $area == 2 ? "RIGHT" : "TEXT"), $used
484 while ($pgidx < $used)
485 printf "%3d %4d: ", $pgidx, $xofs
487 set $xofs = $xofs + $gl0[$pgidx]->pixel_width
488 set $pgidx = $pgidx + 1
491 set $area = $area + 1
495 Pretty print all glyphs in a row structure.
496 Takes one argument, a pointer to a row structure.
503 Pretty print all glyphs in row structure row.
510 if $type == Lisp_Misc
513 if $type == Lisp_Vectorlike
519 Print the type of $, assuming it is an Emacs Lisp value.
520 If the first type printed is Lisp_Vector or Lisp_Misc,
521 a second line gives the more precise type.
526 set $size = ((struct Lisp_Vector *) $ptr)->size
527 output ($size & PVEC_FLAG) ? (enum pvec_type) ($size & PVEC_TYPE_MASK) : $size & ~gdb_array_mark_flag
531 Print the size or vector subtype of $, assuming it is a vector or pseudovector.
536 output (enum Lisp_Misc_Type) (((struct Lisp_Free *) $ptr)->type)
540 Print the specific type of $, assuming it is some misc type.
548 Print $, assuming it is an Emacs Lisp integer. This gets the sign right.
556 Print the pointer portion of $, assuming it is an Emacs Lisp value.
561 print (struct Lisp_Marker *) $ptr
564 Print $ as a marker pointer, assuming it is an Emacs Lisp marker value.
569 print (struct Lisp_Overlay *) $ptr
572 Print $ as a overlay pointer, assuming it is an Emacs Lisp overlay value.
577 print (struct Lisp_Free *) $ptr
580 Print $ as a misc free-cell pointer, assuming it is an Emacs Lisp Misc value.
585 print (struct Lisp_Intfwd *) $ptr
588 Print $ as an integer forwarding pointer, assuming it is an Emacs Lisp Misc value.
593 print (struct Lisp_Boolfwd *) $ptr
596 Print $ as a boolean forwarding pointer, assuming it is an Emacs Lisp Misc value.
601 print (struct Lisp_Objfwd *) $ptr
604 Print $ as an object forwarding pointer, assuming it is an Emacs Lisp Misc value.
609 print (struct Lisp_Buffer_Objfwd *) $ptr
612 Print $ as a buffer-local object forwarding pointer, assuming it is an Emacs Lisp Misc value.
617 print (struct Lisp_Kboard_Objfwd *) $ptr
620 Print $ as a kboard-local object forwarding pointer, assuming it is an Emacs Lisp Misc value.
625 print (struct Lisp_Buffer_Local_Value *) $ptr
628 Print $ as a buffer-local-value pointer, assuming it is an Emacs Lisp Misc value.
634 print (struct Lisp_Symbol *) $ptr
639 Print the name and address of the symbol $.
640 This command assumes that $ is an Emacs Lisp symbol value.
645 print (struct Lisp_String *) $ptr
650 Print the contents and address of the string $.
651 This command assumes that $ is an Emacs Lisp string value.
656 print (struct Lisp_Vector *) $ptr
657 output ($->size > 50) ? 0 : ($->contents[0])@($->size & ~gdb_array_mark_flag)
661 Print the contents and address of the vector $.
662 This command assumes that $ is an Emacs Lisp vector value.
667 print (struct Lisp_Process *) $ptr
672 Print the address of the struct Lisp_process which the Lisp_Object $ points to.
677 print (struct frame *) $ptr
679 set $ptr = (struct Lisp_String *) $ptr
684 Print $ as a frame pointer, assuming it is an Emacs Lisp frame value.
689 print (struct Lisp_Vector *) $ptr
690 output ($->contents[0])@($->size & 0xff)
693 Print $ as a compiled function pointer, assuming it is an Emacs Lisp compiled value.
698 print (struct window *) $ptr
699 set $window = (struct window *) $ptr
700 xgetint $window->total_cols
702 xgetint $window->total_lines
704 xgetint $window->left_col
706 xgetint $window->top_line
708 printf "%dx%d+%d+%d\n", $width, $height, $left, $top
711 Print $ as a window pointer, assuming it is an Emacs Lisp window value.
712 Print the window's position as "WIDTHxHEIGHT+LEFT+TOP".
717 print (struct save_window_data *) $ptr
720 Print $ as a window configuration pointer, assuming it is an Emacs Lisp window configuration value.
725 print (struct Lisp_Subr *) $ptr
730 Print the address of the subr which the Lisp_Object $ points to.
735 print (struct Lisp_Char_Table *) $ptr
738 printf " %d extra slots", ($->size & 0x1ff) - 388
742 Print the address of the char-table $, and its purpose.
743 This command assumes that $ is an Emacs Lisp char-table value.
748 print (struct Lisp_Bool_Vector *) $ptr
749 output ($->size > 256) ? 0 : ($->data[0])@((($->size & ~gdb_array_mark_flag) + 7)/ 8)
753 Print the contents and address of the bool-vector $.
754 This command assumes that $ is an Emacs Lisp bool-vector value.
759 print (struct buffer *) $ptr
761 output ((struct Lisp_String *) $ptr)->data
765 Set $ as a buffer pointer, assuming it is an Emacs Lisp buffer value.
766 Print the name of the buffer.
771 print (struct Lisp_Hash_Table *) $ptr
774 Set $ as a hash table pointer, assuming it is an Emacs Lisp hash table value.
779 print (struct Lisp_Cons *) $ptr
784 Print the contents of $, assuming it is an Emacs Lisp cons.
792 Print the contents of the next cell in a list.
793 This assumes that the last thing you printed was a cons cell contents
794 (type struct Lisp_Cons) or a pointer to one.
799 print/x ($type == Lisp_Cons ? ((struct Lisp_Cons *) $ptr)->car : 0)
802 Print the car of $, assuming it is an Emacs Lisp pair.
808 print/x ($type == Lisp_Cons ? ((struct Lisp_Cons *) $ptr)->u.cdr : 0)
811 Print the cdr of $, assuming it is an Emacs Lisp pair.
816 set $cons = (struct Lisp_Cons *) $ptr
820 while $cons != $nil && $i < 10
824 set $cons = (struct Lisp_Cons *) $ptr
836 Print $ assuming it is a list.
841 print ((struct Lisp_Float *) $ptr)->u.data
844 Print $ assuming it is a lisp floating-point number.
849 print (struct scrollbar *) $ptr
854 Print $ as a scrollbar pointer.
862 if $type == Lisp_Symbol
865 if $type == Lisp_String
868 if $type == Lisp_Cons
871 if $type == Lisp_Float
874 if $type == Lisp_Misc
875 set $misc = (enum Lisp_Misc_Type) (((struct Lisp_Free *) $ptr)->type)
876 if $misc == Lisp_Misc_Free
879 if $misc == Lisp_Misc_Boolfwd
882 if $misc == Lisp_Misc_Marker
885 if $misc == Lisp_Misc_Intfwd
888 if $misc == Lisp_Misc_Boolfwd
891 if $misc == Lisp_Misc_Objfwd
894 if $misc == Lisp_Misc_Buffer_Objfwd
897 if $misc == Lisp_Misc_Buffer_Local_Value
900 # if $misc == Lisp_Misc_Some_Buffer_Local_Value
903 if $misc == Lisp_Misc_Overlay
906 if $misc == Lisp_Misc_Kboard_Objfwd
909 # if $misc == Lisp_Misc_Save_Value
913 if $type == Lisp_Vectorlike
914 set $size = ((struct Lisp_Vector *) $ptr)->size
915 if ($size & PVEC_FLAG)
916 set $vec = (enum pvec_type) ($size & PVEC_TYPE_MASK)
917 if $vec == PVEC_NORMAL_VECTOR
920 if $vec == PVEC_PROCESS
923 if $vec == PVEC_FRAME
926 if $vec == PVEC_COMPILED
929 if $vec == PVEC_WINDOW
932 if $vec == PVEC_WINDOW_CONFIGURATION
938 if $vec == PVEC_CHAR_TABLE
941 if $vec == PVEC_BOOL_VECTOR
944 if $vec == PVEC_BUFFER
947 if $vec == PVEC_HASH_TABLE
956 Print $ as a lisp object of any type.
960 set $data = $arg0->data
961 output ($arg0->size > 1000) ? 0 : ($data[0])@($arg0->size_byte < 0 ? $arg0->size & ~gdb_array_mark_flag : $arg0->size_byte)
966 set $sym = (struct Lisp_Symbol *) $ptr
968 set $sym_name = (struct Lisp_String *) $ptr
972 Print argument as a symbol.
976 set $bt = backtrace_list
978 xgettype (*$bt->function)
979 if $type == Lisp_Symbol
980 xprintsym (*$bt->function)
981 printf " (0x%x)\n", *$bt->args
983 printf "0x%x ", *$bt->function
984 if $type == Lisp_Vectorlike
985 xgetptr (*$bt->function)
986 set $size = ((struct Lisp_Vector *) $ptr)->size
987 output ($size & PVEC_FLAG) ? (enum pvec_type) ($size & PVEC_TYPE_MASK) : $size & ~gdb_array_mark_flag
989 printf "Lisp type %d", $type
997 Print a backtrace of Lisp function calls from backtrace_list.
998 Set a breakpoint at Fsignal and call this to see from where
999 an error was signaled.
1003 set debug_print (which_symbols ($arg0))
1006 Print symbols which references a given lisp object,
1007 either as its symbol value or symbol function.
1011 set $bt = byte_stack_list
1013 xgettype ($bt->byte_string)
1014 printf "0x%x => ", $bt->byte_string
1015 which $bt->byte_string
1020 Print a backtrace of the byte code stack.
1023 # Show Lisp backtrace after normal backtrace.
1024 define hookpost-backtrace
1025 set $bt = backtrace_list
1028 echo Lisp Backtrace:\n
1034 set $tagmask = (((long)1 << gdb_gctypebits) - 1)
1035 set $valmask = gdb_use_lsb ? ~($tagmask) : ((long)1 << gdb_valbits) - 1
1038 When starting Emacs a second time in the same gdb session under
1039 FreeBSD 2.2.5, gdb 4.13, $valmask have lost
1040 their values. (The same happens on current (2000) versions of GNU/Linux
1042 This function reloads them.
1046 # Flush display (X only)
1051 Flush pending X window display updates to screen.
1052 Works only when an inferior emacs is executing.
1060 # Call xreload if a new Emacs executable is loaded.
1066 set print sevenbit-strings
1068 show environment DISPLAY
1069 show environment TERM
1070 set args -geometry 80x40+0+0
1072 # People get bothered when they see messages about non-existent functions...
1073 xgetptr Vsystem_type
1074 # $ptr is NULL in temacs
1076 set $tem = (struct Lisp_Symbol *) $ptr
1078 set $tem = (struct Lisp_String *) $ptr
1079 set $tem = (char *) $tem->data
1081 # Don't let abort actually run, as it will make stdio stop working and
1082 # therefore the `pr' command above as well.
1083 if $tem[0] == 'w' && $tem[1] == 'i' && $tem[2] == 'n' && $tem[3] == 'd'
1084 # The windows-nt build replaces abort with its own function.
1091 # x_error_quitter is defined only on X. But window-system is set up
1092 # only at run time, during Emacs startup, so we need to defer setting
1093 # the breakpoint. init_sys_modes is the first function called on
1094 # every platform after init_display, where window-system is set.
1095 tbreak init_sys_modes
1098 xgetptr Vwindow_system
1099 set $tem = (struct Lisp_Symbol *) $ptr
1101 set $tem = (struct Lisp_String *) $ptr
1102 set $tem = (char *) $tem->data
1103 # If we are running in synchronous mode, we want a chance to look
1104 # around before Emacs exits. Perhaps we should put the break
1105 # somewhere else instead...
1106 if $tem[0] == 'x' && $tem[1] == '\0'
1107 break x_error_quitter
1111 # arch-tag: 12f34321-7bfa-4240-b77a-3cd3a1696dfe