From: Stefan Monnier <monnier@iro.umontreal.ca>
Cc: emacs-devel@gnu.org
Subject: Re: Debugging memory leaks/stale references
Date: Tue, 21 Sep 2004 15:57:10 -0400 [thread overview]
Message-ID: <jwvfz5b76tj.fsf-monnier+emacs@gnu.org> (raw)
In-Reply-To: <87d60fjzdg.fsf@deneb.enyo.de> (Florian Weimer's message of "Tue, 21 Sep 2004 19:38:51 +0200")
> Is it possible to dump all reachable Lisp objects to a file, in the
> format that is returned by princ?
Not that I know.
> I could run diff(1) on two versions of the file, and this might reveal
> which objects are leaking (or held by stale references).
That's an interesting idea.
But one of the problems is that `princ' is not enough. Starting from the
root set (i.e. the stack, and the global vars), princ would fail to print
a lot of info because buffers are just printed #<buffer foo> without
exposing its contents.
> garbage-collect output alone is not very helpful.
Indeed. One thing I was thinking about is a function
`count-exclusive-children' which would take an object X as a parameter
(could be the obarray, a buffer, a symbol, ...) and would return the number
of objects that would die if X died.
I think this can be implemented reasonably easily:
0 - change mark_object so as to increment a counter `objects_marked' each
time it marks an object.
1 - set the mark bit on X (so as ot pretend it and its children were
already marked).
2 - call the gc_mark routine (extracted from garbage_collect).
4 - reset objects_marked to 0.
3 - call `mark_object(X)'.
5 - read the value of objects_marked.
6 - do the gc_sweep.
7 - return the value read.
Obviously it'd be a slow function (it does a full GC just to get a single
integer number), but maybe it's good enough?
You could start by calling (mapcar 'count-exclusive-children (buffer-list))
every once in a while to see how the numbers evolve.
Or maybe (let ((res nil))
(mapatoms (lambda (s)
(push (cons s count-exclusive-children s) res)))
res)
> (I'm going to test CVS Emacs soon, just to be sure that the behavior
> is still the same.
I think it's indeed the same with CVS, based on reports we got here not that
long ago from Kai and others.
> It's probably a Gnus bug, but you never know.)
It might also be in Emacs or in an interaction between the two.
I remember seeing strange things a couple years back where dead buffers
where kept "alive" much longer than I thought (and they can hold on to
a lot of data in their variables and overlays).
Stefan
next prev parent reply other threads:[~2004-09-21 19:57 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-09-21 17:38 Debugging memory leaks/stale references Florian Weimer
2004-09-21 19:49 ` Simon Josefsson
2004-09-27 19:40 ` Florian Weimer
2004-09-27 19:52 ` Stefan Monnier
2004-09-27 20:36 ` Florian Weimer
2004-09-27 20:49 ` Stefan Monnier
2004-09-27 20:48 ` Simon Josefsson
2004-09-28 15:20 ` Richard Stallman
2004-09-28 21:00 ` Florian Weimer
2004-09-28 21:51 ` Florian Weimer
2004-09-29 16:39 ` Richard Stallman
2004-09-29 23:51 ` Kenichi Handa
2004-09-28 21:40 ` Kim F. Storm
2004-09-21 19:57 ` Stefan Monnier [this message]
2004-09-21 21:01 ` Florian Weimer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=jwvfz5b76tj.fsf-monnier+emacs@gnu.org \
--to=monnier@iro.umontreal.ca \
--cc=emacs-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.