How to debug Segmentation Fault?
deadalnix via Digitalmars-d
digitalmars-d at puremagic.com
Sun Dec 13 22:19:19 PST 2015
On Monday, 14 December 2015 at 05:26:52 UTC, Bottled Gin wrote:
> Greetings
>
> I am calling a D function from an opensource application coded
> in C/C++. My code crashes, though there is no reason for it to
> crash. Also when I call my D function from inside D, it does
> not crash. The D function does not take any arguments, nor does
> it try to access any variable declared in C/C++. So it seems to
> me that it is some memory corruption issue.
>
> But since I am not able to reproduce the crash in standalone D
> code, I am not able to file a bug.
>
> Can someone please guide me how I can debug this further? I
> have reduced the D code that crashes, but it crashes only when
> called from the opensource C/C++ application. The C/C++
> application is single threaded and therefor gives full control
> to D function. And then D code runs for some time and crashes
> thereafter with a segmentation fault. I am pasting the D code
> below (C++ calls initialize function):
>
> extern(C) void initialize() {
> import core.runtime;
> Runtime.initialize;
> frop();
> }
>
> void frop() {
> import core.thread;
> Dynamic obj = new Dynamic;
> for (size_t i; i!=200; ++i) {
> obj.rehash();
> }
> void foo() {
> for (size_t i; i!=200; ++i) {
> import std.stdio;
> writeln(i);
> obj.rehash(); // segfault happens in the second iteration of
> loop
> obj.proc();
> }
> }
> Thread bar = new Thread(&foo);
> bar.start();
> bar.join();
> }
>
> final class Hash {
> private Dynamic[Dynamic] _m_map;
> public void clear() {
> // only static instance of Hash is used
> // no synchronized region required -- but still
> synchronized(this) {
> _m_map = null;
> }
> }
> }
>
> class Dynamic {
> void rehash () {
> // only thread local variables no synchronized required --
> but still
> synchronized(this) {
> static Hash hash ;
> if(hash is null) hash = new Hash;
> hash.clear();
> }
> }
> void proc () {
> // only stack variables, so no synchronized required -- but
> still
> synchronized(this) {
> char[] space;
> space.length = 5000;
> }
> }
> }
>
>
>
>
> // Regards
> // - Puneet
gdb or lldb. Yes, it sucks.
More information about the Digitalmars-d
mailing list