How to debug (potential) GC bugs?
Guillaume Piolat via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Tue Sep 27 05:56:36 PDT 2016
On Sunday, 25 September 2016 at 16:23:11 UTC, Matthias Klumpp
wrote:
> Hello!
> I am working together with others on the D-based
> appstream-generator[1] project, which is generating software
> metadata for "software centers" and other package-manager
> functionality on Linux distributions, and is used by default on
> Debian, Ubuntu and Arch Linux.
>
> For Ubuntu, some modifications on the code were needed, and
> apparently for them the code is currently crashing in the GC
> collection thread: http://paste.debian.net/840490/
>
> The project is running a lot of stuff in parallel and is using
> the GC (if the extraction is a few seconds slower due to the GC
> being active, it doesn't matter much).
>
> We also link against a lot of 3rd-party libraries and use a big
> amount of existing C code in the project.
>
> So, I would like to know the following things:
>
> 1) Is there any caveat when linking to C libraries and using
> the GC in a project? So far, it seems to be working well, but
> there have been a few cases where I was suspicious about the GC
> actually doing something to malloc'ed stuff or C structs
> present in the bindings.
There is no way the GC scans memory allocated with malloc (unless
you tell it to) or used in the bindings.
A caveat is that if you are called from C (not your case), you
must initialize the runtime, and attach/detach threads.
The GC could well stop threads that are currently in the C code
if they were registered to the runtime.
> 2) How can one debug issues like the one mentioned above
> properly? Since it seems to happen in the GC and doesn't give
> me information on where to start searching for the issue, I am
> a bit lost.
There can be multiple reasons.
- The GC is collecting some object that is unreachable from its
POV; when you are actually using it.
- The GC is calling destructors, that should not be called by
the GC. Performing illegal operations. usually this is solved by
using deterministic destruction instead and never relying on a
destructor called by the GC.
- The GC tries to stop threads that don't exist anymore or are
not interruptible
My advice is to have a fuly deterministic tree of objects, like a
C++ program, and Google for "GC-proof resource class" in case you
are using classes.
More information about the Digitalmars-d-learn
mailing list