Compiling with -profile=gc makes program crash - why?

Ivan Kazmenko via Digitalmars-d digitalmars-d at puremagic.com
Wed Apr 20 15:27:36 PDT 2016


I'm trying to use DMD option "-profile=gc".  With this option, 
the following simple program crashes with 2.071.0 down to 2.069.0 
but still works on 2.068.2.  The command line is "dmd -g 
-profile=gc prfail1.d" on Windows (compiled to 32-bit by default).

-----prfail1.d-----
import std.concurrency;
void someWork () {auto x = [1];}
void main () {spawn (&someWork);}
-----

The crash happens almost always, >90% of runs of the compiled 
program.  Here's the error output:

-----
object.Error@(0): Access Violation
----------------
0x00409651 in nothrow int 
rt.profilegc._staticDtor407().__foreachbody2(ref 
immutable(char)[], ref rt.profilegc.Entry)
0x00409986 in void rt.profilegc.__moddtor()
0x00427444 in __threadstartex
0x77869ED2 in RtlInitializeExceptionChain
0x77869EA5 in RtlInitializeExceptionChain
-----

With added "-m64", it just crashes and does not print anything.

Am I doing something wrong, or is it a 2.069 regression?

Interestingly, a modified version does not crash:

-----prfail2.d-----
import std.concurrency;
void someWork () {auto x = [1];}
void main () {spawn (&someWork); someWork ();}
-----

I was curious if this guarantees that the spawned thread finishes 
before the main thread, but the third example, also crashing, 
seems to contradict that:

-----prfail3.d-----
import std.concurrency;
void someWork () {auto x = [1];}
void main () {
     spawnLinked (&someWork);
     try {receive ((int) {});}
     catch (LinkTerminated o) {}
}
-----

Ivan Kazmenko.



More information about the Digitalmars-d mailing list