* [dpeschel@eskimo.com: Emacs 21.2 -- debugger-frame-offset is 8, should be 6]
@ 2008-01-30 20:52 Richard Stallman
0 siblings, 0 replies; 2+ messages in thread
From: Richard Stallman @ 2008-01-30 20:52 UTC (permalink / raw)
To: emacs-devel
Would someone please DTRT, then ack?
------- Start of forwarded message -------
Date: Tue, 29 Jan 2008 14:35:01 -0800
From: Derek Peschel <dpeschel@eskimo.com>
To: bug-gnu-emacs@gnu.org
Message-ID: <20080129143501.A8723@eskimo.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Subject: Emacs 21.2 -- debugger-frame-offset is 8, should be 6
The debugger (not edebug, the one in debug.el) uses the
debugger-frame-offset constant to affect breakpoints on stack frames.
So if the constant becomes wrong, breakpoint commands will appear to work
but actually affect the wrong frame. I have included a patch. I don't
think the problem (and the change) depend on or affect any other parts
of Emacs, but I haven't checked.
The guidelines on bug reporting basically don't trust users to analyze
problems, so I have also included steps you can follow to see if you
agree with me. As a side effect they add a new function and keystroke
to debug.el, so that Emacs can help find the correct value of
debugger-frame-offset in the future. This is much easier than having
to go into gdb (I know, I did that), and I suggest keeping the function
in debug.el even if it's not bound to any keys.
Please let me know if you have any questions.
- -- Derek
My system:
- ----------
I'm running Mac OS 10.3.7 -- uname -a gives
Darwin Derek-Peschels-Computer.local 7.7.0 Darwin Kernel Version 7.7.0: Sun Nov 7 16:06:51 PST 2004; root:xnu/xnu-517.9.5.obj~1/RELEASE_PPC Power Macintosh powerpc
My Emacs is the one Apple shipped -- M-x emacs-version gives
GNU Emacs 21.2.1 (powerpc-apple-darwin7.0) of 1976-04-01 on localhost
The shell commands below use bash -- echo $BASH_VERSION gives
2.05b.0(1)-release
The shell commands also use patch -- patch -v starts with
patch 2.5.8
Copyright (C) 1988 Larry Wall
Copyright (C) 2002 Free Software Foundation, Inc.
Notations:
- ----------
?> refers to a step I haven't written commands for
shell> refers to a command typed at the bash prompt.
emacs> refers to keys typed in Emacs.
emacs= followed by a space and a line of text shows the message line
(which could be a prompt for an argument, or the result of a command).
emacs= followed by dashes, a screen of text, and dashes shows the contents
of a buffer.
Included files:
- ---------------
debug.el.patch-fix patch to apply fix -- not used
in the procedure
debug.el.patch-test-orig patch to add information command
debug.el.patch-test-fix patch to add information command
and apply fix
debugger-frame-offset-test.el LISP code to set up debugger
for tests described in this procedure
Created or changed files:
- -------------------------
working directory created below (or may already exist)
debug.el.patch-test-orig copied from mail
debug.el.patch-test-fix copied from mail
debugger-frame-offset-test.el copied from mail
debug.el created below
debug.elc created below
debug.el.old created below
debug.el.new created below
debug.el.disabled-during-bug-fix temporary name for existing debug.el
debug.elc.disabled-during-bug-fix temporary name for existing debug.elc
home directory
.emacs created below
.emacs.disabled-during-bug-fix temporary name for existing .emacs
Procedure -- Setup:
- -------------------
1. start a new shell since current directory and some environment variables
will be changed
?>
2. create working directory, then change to it
shell> export WORK=~/share/emacs/site-lisp could be any directory
since it will be added
to Emacs's load-path later
shell> mkdir -p $WORK create it if needed
shell> cd $WORK
3. put debug.el.patch-test-orig and debug.el.patch-test-fix and
debugger-frame-offset-test.el in working directory
?>
4. create versions of debug.el used by later steps
shell> mv -i debug.el debug.el.disabled-during-bug-fix
if debug.el exists
shell> mv -i debug.elc debug.elc.disabled-during-bug-fix
if debug.elc exists
shell> cp /usr/share/emacs/21.2/lisp/emacs-lisp/debug.el .
or from another appropriate
directory
shell> cp -i debug.el debug.el.new
shell> patch <debug.el.patch-test-orig patches debug.el
shell> patch <debug.el.patch-test-fix patches debug.el.new
5. create working .emacs
shell> mv -i ~/.emacs ~/.emacs.disabled-during-bug-fix
if .emacs exists
shell> emacs ~/.emacs
emacs> (add-to-list 'load-path "~/share/emacs/site-lisp") RET
string in quotes must match
WORK
emacs> C-x C-c
6. byte-compile debug.el (it must run byte-compiled)
shell> emacs
emacs> M-x byte-compile-file RET
emacs= Byte compile file: ~/share/emacs/site-lisp/
prompt matches WORK
emacs> debug.el RET I get warnings about
unread-command-char being
obsolete; the debugger saves
and restores it, probably so
you can debug old code
emacs> C-x C-c
Procedure -- Show existing bug:
- -------------------------------
7. load test case, run test case
shell> emacs
emacs> M-x load-file RET
emacs= Load file: ~/share/emacs/site-lisp/
emacs> debugger-frame-offset-test.el RET
emacs=
- ------------------------------------------------------------------------------
Debugger entered: ("in fun8")
fun8()
fun7()
fun6()
fun5()
fun4()
fun3()
fun2()
fun1()
eval-buffer(#<buffer *load*> nil "/Users/dpeschel/share/emacs/site-lisp/debugger-frame-offset-test.el" nil t)
load-with-code-conversion("/Users/dpeschel/share/emacs/site-lisp/debugger-frame-offset-test.el" "/Users/dpeschel/share/emacs/site-lisp/debugger-frame-offset-test.el" nil nil)
load("/Users/dpeschel/share/emacs/site-lisp/debugger-frame-offset-test.el" nil nil t)
load-file("~/share/emacs/site-lisp/debugger-frame-offset-test.el")
* call-interactively(load-file)
execute-extended-command(nil)
call-interactively(execute-extended-command)
- ------------------------------------------------------------------------------
8. in debugger, move to a frame, look at what "i" command says
emacs> i
emacs= (t fun6) does not match function name
of frame at cursor
emacs> C-u C-n C-u C-n C-u C-n get to
"call-interactively(load-file)"
frame, last one that I expect
to have a printout
corresponding to a real frame
emacs> i
emacs= (t call-interactively execute-extended-command)
does not match function name
of frame at cursor
emacs> C-n if expectation is right,
going down onscreen
should not have a printout
corresponding to a real frame
emacs> i
emacs= nil does not match any function
emacs> C-x C-c
Procedure -- Apply fix:
- -----------------------
9. switch debug.el versions
shell> rm -f debug.elc
shell> mv -i debug.el debug.el.old
shell> mv -i debug.el.new debug.el
10. byte-compile debug.el
(repeat step #6)
Procedure -- Test fix:
- ----------------------
11. restart emacs, load test case, run test case
(repeat step #7; debugger window contents should be same)
12. in debugger, move to a frame, look at what "i" command says
emacs> i
emacs= (t fun8) matches function name of
frame at cursor
emacs> C-u C-n C-u C-n C-u C-n get to
"call-interactively(load-file)"
frame, which was a boundary
case before the fix was
applied
emacs> i
emacs= (t call-interactively load-file) matches function name of
frame at cursor
emacs> C-n test next frame onscreen,
which was past the boundary
case before the fix was
applied
emacs> i
emacs= (t execute-extended-command nil) matches function name of
frame at cursor
emacs> C-n test next frame onscreen,
boundary case now
emacs= (t call-interactively execute-extended-command)
matches function name of
frame at cursor
emacs> C-x C-c
Procedure -- Undo setup:
- ------------------------
13. undo changes to ~/.emacs
shell> rm ~/.emacs if .emacs didn't exist
before this procedure
shell> mv ~/.emacs.disabled-during-bug-fix ~/.emacs
if .emacs already existed
before this procedure
14. undo changes to working directory
If the directory didn't exist before this procedure:
shell> cd or whatever was the
current directory when WORK
was created
shell> rm -rf $WORK
If the directory did exist before this procedure:
shell> mv debug.el.disabled-during-bug-fix debug.el
if debug.el already existed
before this procedure
shell> mv debug.elc.disabled-during-bug-fix debug.elc
if debug.elc already existed
before this procedure
shell> rm debug.el.patch-test-orig
shell> rm debug.el-patch-test-fix
shell> rm debugger-frame-offset-test.el
shell> rm debug.el.old
shell> rm debug.el.new
------- End of forwarded message -------
^ permalink raw reply [flat|nested] 2+ messages in thread
* [dpeschel@eskimo.com: Emacs 21.2 -- debugger-frame-offset is 8, should be 6]
@ 2008-01-30 20:52 Richard Stallman
0 siblings, 0 replies; 2+ messages in thread
From: Richard Stallman @ 2008-01-30 20:52 UTC (permalink / raw)
To: emacs-devel
Would someone please DTRT, then ack? It would be good to put his test
case into a file in admin, or lisp/emacs-lisp, so we can use it from
time to time in the future.
Date: Tue, 29 Jan 2008 15:53:43 -0800
From: Derek Peschel <dpeschel@eskimo.com>
To: bug-gnu-emacs@gnu.org
Message-ID: <20080129155343.A12974@eskimo.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="zYM0uCDKw75PZbzx"
Content-Disposition: inline
In-Reply-To: <20080129143501.A8723@eskimo.com>;
from dpeschel@eskimo.com on Tue, Jan 29, 2008 at 02:35:01PM -0800
Subject: Re: Emacs 21.2 -- debugger-frame-offset is 8, should be 6
--zYM0uCDKw75PZbzx
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Sorry, I used mutt with a command line format I don't normally use, and
didn't have a chance to attach the patches and other files. Here they are.
--zYM0uCDKw75PZbzx
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="debug.el.patch-fix"
--- debug.el Mon Jan 28 13:10:09 2008
+++ debug.el Mon Jan 28 13:10:34 2008
@@ -300,7 +300,7 @@
;; within the first one that appears in the backtrace buffer.
;; Assumes debugger-frame is called from a key;
;; will be wrong if it is called with Meta-x.
-(defconst debugger-frame-offset 8 "")
+(defconst debugger-frame-offset 6 "")
(defun debugger-jump ()
"Continue to exit from this frame, with all debug-on-entry suspended."
--zYM0uCDKw75PZbzx
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="debug.el.patch-test-fix"
--- debug.el.new Mon Jan 28 13:23:15 2008
+++ debug.el.new Mon Jan 28 13:25:05 2008
@@ -300,7 +300,7 @@
;; within the first one that appears in the backtrace buffer.
;; Assumes debugger-frame is called from a key;
;; will be wrong if it is called with Meta-x.
-(defconst debugger-frame-offset 8 "")
+(defconst debugger-frame-offset 6 "")
(defun debugger-jump ()
"Continue to exit from this frame, with all debug-on-entry suspended."
@@ -379,6 +379,11 @@
(insert ? )))
(beginning-of-line))
+(defun debugger-frame-info ()
+ "Show information about the frame at point."
+ (interactive)
+ (beginning-of-line)
+ (message "%s" (prin1-to-string (backtrace-frame (+ (debugger-frame-number) debugger-frame-offset)))))
(put 'debugger-env-macro 'lisp-indent-function 0)
@@ -452,6 +457,7 @@
(define-key debugger-mode-map "j" 'debugger-jump)
(define-key debugger-mode-map "r" 'debugger-return-value)
(define-key debugger-mode-map "u" 'debugger-frame-clear)
+ (define-key debugger-mode-map "i" 'debugger-frame-info)
(define-key debugger-mode-map "d" 'debugger-step-through)
(define-key debugger-mode-map "l" 'debugger-list-functions)
(define-key debugger-mode-map "h" 'describe-mode)
--zYM0uCDKw75PZbzx
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="debug.el.patch-test-orig"
--- debug.el Mon Jan 28 13:23:15 2008
+++ debug.el Mon Jan 28 13:24:00 2008
@@ -379,6 +379,11 @@
(insert ? )))
(beginning-of-line))
+(defun debugger-frame-info ()
+ "Show information about the frame at point."
+ (interactive)
+ (beginning-of-line)
+ (message "%s" (prin1-to-string (backtrace-frame (+ (debugger-frame-number) debugger-frame-offset)))))
(put 'debugger-env-macro 'lisp-indent-function 0)
@@ -452,6 +457,7 @@
(define-key debugger-mode-map "j" 'debugger-jump)
(define-key debugger-mode-map "r" 'debugger-return-value)
(define-key debugger-mode-map "u" 'debugger-frame-clear)
+ (define-key debugger-mode-map "i" 'debugger-frame-info)
(define-key debugger-mode-map "d" 'debugger-step-through)
(define-key debugger-mode-map "l" 'debugger-list-functions)
(define-key debugger-mode-map "h" 'describe-mode)
--zYM0uCDKw75PZbzx
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="debugger-frame-offset-test.el"
q(defun fun1 ()
(fun2))
(defun fun2 ()
(fun3))
(defun fun3 ()
(fun4))
(defun fun4 ()
(fun5))
(defun fun5 ()
(fun6))
(defun fun6 ()
(fun7))
(defun fun7 ()
(fun8))
(defun fun8 ()
(debug nil "in fun8"))
(fun1)
--zYM0uCDKw75PZbzx--
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2008-01-30 20:52 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-01-30 20:52 [dpeschel@eskimo.com: Emacs 21.2 -- debugger-frame-offset is 8, should be 6] Richard Stallman
-- strict thread matches above, loose matches on Subject: below --
2008-01-30 20:52 Richard Stallman
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).