mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2024-12-04 08:47:11 +00:00
5403b2d3aa
The DATA_SEG_BITS hack was needed for older 32 bit platforms. As a result of this change, Emacs won't work on IRIX 6.5 with IRIX cc, but that platform is so old that SGI itself stopped supporting it in December 2013. If you still need Emacs on IRIX, please either compile with GCC and port the undumping code, or run './configure --with-wide-int'. * configure.ac (DATA_SEG_BITS): Remove. All uses removed. * src/alloc.c (gdb_make_enums_visible): Update to match lisp.h. * src/lisp.h (GCTYPEBITS): Move definition up, and switch to the DEFINE_GDB_SYMBOL_START way to define it. (NONPOINTER_BITS): New macro. (EMACS_INT): Use it. [!USE_LSB_TAG && !WIDE_EMACS_INT]: Fail, and suggest reporting the problem and/or configuring --with-wide-int. (USE_LSB_TAG): Simplify, based on above changes. (gdb_DATA_SEG_BITS): Remove. All uses removed. * src/vm-limit.c (exceeds_lisp_ptr): Remove. All uses removed.
267 lines
8.1 KiB
Plaintext
267 lines
8.1 KiB
Plaintext
# emacs-buffer.gdb --- gdb macros for recovering buffers from emacs coredumps
|
|
|
|
# Copyright (C) 2005-2014 Free Software Foundation, Inc.
|
|
|
|
# Maintainer: Noah Friedman <friedman@splode.com>
|
|
# Created: 2005-04-28
|
|
|
|
# This file is part of GNU Emacs.
|
|
|
|
# GNU Emacs is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
|
|
# GNU Emacs is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
# Commentary:
|
|
|
|
# This is a set of gdb macros for recovering the contents of buffers from
|
|
# an Emacs coredump; they may not always be file-backed or have a recent
|
|
# autosave.
|
|
#
|
|
# The Emacs executable must have debugging symbols for this to work.
|
|
# But you never strip Emacs, right?
|
|
#
|
|
# The main commands of interest are `ybuffer-list', `yfile-buffers',
|
|
# `ysave-buffer', and `ybuffer-contents'. The `y' prefix avoids any
|
|
# namespace collisions with emacs/src/.gdbinit.
|
|
|
|
# Since the internal data structures in Emacs occasionally from time to
|
|
# time, you should use the version of this file that came with your
|
|
# particular Emacs version; older versions might not work anymore.
|
|
|
|
# Example usage:
|
|
#
|
|
# $ gdb /export/src/emacs/2005-05-02--03-17/src/emacs core.emacs.6.9845
|
|
# Current directory is /u/noah/
|
|
# GNU gdb (6.1post-1.20040607.43rh)
|
|
# ...
|
|
# #0 0x400007a2 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2
|
|
# (gdb) source emacs-buffer.gdb
|
|
# (gdb) ybuffer-list
|
|
# B# M Size Name Mode File
|
|
# -- - ---- ---- ---- ----
|
|
# 0 * 556 mail to emacs-devel@gnu.org Mail
|
|
# 1 * 0 *Minibuf-1* Fundamental
|
|
# 2 145769 ChangeLog Change Log /u/noah/lib/elisp/noahf/ChangeLog
|
|
# 3 6619 ascii-table.el Elisp /u/noah/lib/elisp/noahf/ascii-table.el
|
|
# 4 * 48396 *Messages* Fundamental
|
|
# 5 3191 *Apropos* Apropos
|
|
# 6 17642 init-21.el Elisp /u/noah/etc/init/emacs/init-21.el
|
|
# 7 333 cpuid.c C /u/noah/cpuid.c
|
|
# 8 230 src Dired
|
|
# 9 218 noah Dired
|
|
# 10 * 21 *Echo Area 0* Fundamental
|
|
# 11 * 0 *Echo Area 1* Fundamental
|
|
# 12 319952 *bbdb data* Text /u/noah/.bbdb
|
|
# (gdb) ysave-buffer 0 mail.save
|
|
# [Wrote buffer "mail to emacs-devel@gnu.org" to file mail.save]
|
|
# (gdb) quit
|
|
# $ ls -l mail.save
|
|
# -rw-rw-rw- 1 noah user 556 May 2 04:05 mail.save
|
|
# $
|
|
|
|
# Code:
|
|
|
|
# Force loading of symbols, enough to give us VALMASK etc.
|
|
set main
|
|
|
|
# When nonzero, display some extra diagnostics in various commands
|
|
set $yverbose = 1
|
|
set $yfile_buffers_only = 0
|
|
|
|
define ygetptr
|
|
set $ptr = $arg0
|
|
set $ptr = (CHECK_LISP_OBJECT_TYPE ? $ptr.i : $ptr) & VALMASK
|
|
end
|
|
|
|
define ybuffer-list
|
|
set $files_only = $yfile_buffers_only
|
|
set $yfile_buffers_only = 0
|
|
|
|
if $yverbose
|
|
printf "B# M Size Name Mode File\n"
|
|
printf "-- - ---- ---- ---- ----\n"
|
|
end
|
|
|
|
set $i = 0
|
|
set $alist = Vbuffer_alist
|
|
while $alist != Qnil
|
|
ygetptr $alist
|
|
set $this = ((struct Lisp_Cons *) $ptr)->car
|
|
set $alist = ((struct Lisp_Cons *) $ptr)->u.cdr
|
|
|
|
# Vbuffer_alist elts are pairs of the form (name . buffer)
|
|
ygetptr $this
|
|
set $buf = ((struct Lisp_Cons *) $ptr)->u.cdr
|
|
ygetptr $buf
|
|
set $buf = (struct buffer *) $ptr
|
|
|
|
if ! ($files_only && $buf->filename_ == Qnil)
|
|
ygetptr $buf->name_
|
|
set $name = ((struct Lisp_String *) $ptr)->data
|
|
set $modp = ($buf->text->modiff > $buf->text->save_modiff) ? '*' : ' '
|
|
|
|
ygetptr $buf->mode_name_
|
|
set $mode = ((struct Lisp_String *) $ptr)->data
|
|
|
|
if $buf->filename_ != Qnil
|
|
ygetptr $buf->filename_
|
|
printf "%2d %c %9d %-20s %-10s %s\n", \
|
|
$i, $modp, ($buf->text->z_byte - 1), $name, $mode, \
|
|
((struct Lisp_String *) $ptr)->data
|
|
else
|
|
printf "%2d %c %9d %-20s %-10s\n", \
|
|
$i, $modp, ($buf->text->z_byte - 1), $name, $mode
|
|
end
|
|
end
|
|
|
|
set $i++
|
|
end
|
|
end
|
|
document ybuffer-list
|
|
Display a list of buffer names, sizes, and other attributes.
|
|
The buffer number in the first column is used as an argument
|
|
to some other emacs-buffer recovery commands, e.g. `ysave-buffer'.
|
|
end
|
|
|
|
define yfile-buffers
|
|
set $yfile_buffers_only = 1
|
|
ybuffer-list
|
|
end
|
|
document yfile-buffers
|
|
Display a list of buffers which are associated with files.
|
|
This is like `ybuffer-list', but only buffers that were visiting files
|
|
are displayed.
|
|
end
|
|
|
|
define yset-buffer
|
|
set $i = $arg0
|
|
|
|
set $alist = Vbuffer_alist
|
|
while ($alist != Qnil && $i > 0)
|
|
ygetptr $alist
|
|
set $alist = ((struct Lisp_Cons *) $ptr)->u.cdr
|
|
set $i--
|
|
end
|
|
|
|
# Get car of alist; this is a pair (name . buffer)
|
|
ygetptr $alist
|
|
set $this = ((struct Lisp_Cons *) $ptr)->car
|
|
|
|
# Get the buffer object
|
|
ygetptr $this
|
|
set $this = ((struct Lisp_Cons *) $ptr)->u.cdr
|
|
|
|
ygetptr $this
|
|
set $ycurrent_buffer = (struct buffer *) $ptr
|
|
end
|
|
document yset-buffer
|
|
Set current buffer (for other emacs-buffer recovery commands) to the ARG'th
|
|
buffer as displayed by `ybuffer-list'.
|
|
end
|
|
|
|
define yget-buffer-pointers
|
|
yset-buffer $arg0
|
|
set $buf = $ycurrent_buffer->text
|
|
|
|
set $beg = $buf->beg
|
|
set $gap = $beg + $buf->gpt_byte
|
|
set $gap_end = $gap + $buf->gap_size - 1
|
|
set $end = $gap_end + ($buf->z_byte - $buf->gpt_byte)
|
|
|
|
set $modp = $buf->modiff > $buf->save_modiff
|
|
|
|
#print *$beg@($gap - $beg)
|
|
#print *$gap_end@($end - $gap_end)
|
|
end
|
|
document yget-buffer-pointers
|
|
Update convenience variables with address pointers for the ARG'th buffer
|
|
as displayed by `ybuffer-list'.
|
|
|
|
This also sets the current buffer using `yset-buffer' (which see).
|
|
end
|
|
|
|
define yget-current-buffer-name
|
|
set $this = $ycurrent_buffer->name_
|
|
ygetptr $this
|
|
set $ycurrent_buffer_name = ((struct Lisp_String *) $ptr)->data
|
|
end
|
|
document yget-current-buffer-name
|
|
Set $ycurrent_buffer_name to the name of the currently selected buffer.
|
|
end
|
|
|
|
define ycurrent-buffer
|
|
yget-current-buffer-name
|
|
printf "%s\n", $ycurrent_buffer_name
|
|
end
|
|
document ycurrent-buffer
|
|
Display the currently selected buffer.
|
|
end
|
|
|
|
define ydump-buffer
|
|
yget-buffer-pointers $arg0
|
|
if $buf->z_byte > 1
|
|
if $buf->z_byte <= $buf->gpt_byte
|
|
set $endptr = $beg + $buf->gpt_byte - 1
|
|
dump binary memory $arg1 $beg $endptr
|
|
else
|
|
dump binary memory $arg1 $beg $gap-1
|
|
append binary memory $arg1 $gap_end $end
|
|
set $endptr = $end
|
|
end
|
|
end
|
|
end
|
|
document ydump-buffer
|
|
Write contents of buffer N (as numbered according to `ybuffer-list') to
|
|
file FILE.
|
|
|
|
This is mainly used as an internal subroutine for `ysave-buffer' and
|
|
`ybuffer-contents', which see.
|
|
end
|
|
|
|
define ysave-buffer
|
|
ydump-buffer $arg0 $arg1
|
|
if $yverbose
|
|
yget-current-buffer-name
|
|
if $buf->z_byte <= 1
|
|
printf "[Buffer \"%s\" is empty.]\n", $ycurrent_buffer_name
|
|
else
|
|
# Output string broken into separate calls as necessary to avoid
|
|
# requiring a running process for evaluation.
|
|
printf "[Wrote buffer \"%s\" to file ", $ycurrent_buffer_name
|
|
echo $arg1]\n
|
|
end
|
|
end
|
|
end
|
|
document ysave-buffer
|
|
Save contents of buffer N (as numbered according to `ybuffer-list') to
|
|
file FILE.
|
|
end
|
|
|
|
define ybuffer-contents
|
|
ydump-buffer $arg0 /dev/stdout
|
|
if $yverbose && $buf->z_byte <= 1
|
|
yget-current-buffer-name
|
|
printf "[Buffer \"%s\" is empty.]\n", $ycurrent_buffer_name
|
|
else
|
|
if *($endptr-1) != '\n'
|
|
echo \n
|
|
end
|
|
end
|
|
end
|
|
document ybuffer-contents
|
|
Write contents of buffer N (numbered according to `ybuffer-list') to stdout.
|
|
end
|
|
|
|
# local variables:
|
|
# mode: gdb-script
|
|
# end:
|