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