+define xprintsym
+ set $sym = (struct Lisp_Symbol *) ((((int) $arg0) & $valmask) | gdb_data_seg_bits)
+ set $sym_name = ((struct Lisp_String *)(($sym->xname & $valmask) | gdb_data_seg_bits))
+ output ($sym_name->data[0])@($sym_name->size_byte < 0 ? $sym_name->size : $sym_name->size_byte)
+ echo \n
+end
+document xprintsym
+ Print argument as a symbol.
+end
+
+define xbacktrace
+ set $bt = backtrace_list
+ while $bt
+ set $type = (enum Lisp_Type) ((*$bt->function >> gdb_valbits) & 0x7)
+ if $type == Lisp_Symbol
+ xprintsym *$bt->function
+ else
+ printf "0x%x ", *$bt->function
+ if $type == Lisp_Vectorlike
+ set $size = ((struct Lisp_Vector *) ((*$bt->function & $valmask) | gdb_data_seg_bits))->size
+ output (enum pvec_type) (($size & PVEC_FLAG) ? $size & PVEC_TYPE_MASK : 0)
+ else
+ printf "Lisp type %d", $type
+ end
+ echo \n
+ end
+ set $bt = $bt->next
+ end
+end
+document xbacktrace
+ Print a backtrace of Lisp function calls from backtrace_list.
+ Set a breakpoint at Fsignal and call this to see from where
+ an error was signaled.
+end
+
+define xreload
+ set $valmask = ((long)1 << gdb_valbits) - 1
+ set $nonvalbits = gdb_emacs_intbits - gdb_valbits
+end
+document xreload
+ When starting Emacs a second time in the same gdb session under
+ FreeBSD 2.2.5, gdb 4.13, $valmask and $nonvalbits have lost
+ their values. (The same happens on current (2000) versions of GNU/Linux
+ with gdb 5.0.)
+ This function reloads them.
+end
+
+define hook-run
+ xreload
+end
+
+# Call xreload if a new Emacs executable is loaded.
+define hookpost-run
+ xreload
+end
+