all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
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

  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.