unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* [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).