Thread overview
Re: global static pointer variable in DLL
May 25, 2008
Zarathustra
May 25, 2008
torhu
May 25, 2008
Zarathustra
May 25, 2008
Koroskin Denis
May 26, 2008
Zarathustra
May 25, 2008
torhu Wrote:

> Zarathustra wrote:
> > 
> > Oh, I find out something.
> > The most crashes occur in similar calls (in DLL) like following:
> > ________________________________________________________
> > offs += fprintf(gl2ps->stream, "%%PDF-1.4\n");
> > ________________________________________________________
> > it looks like DLL haven't got access to FILE(gl2ps->stream), but why?
> > The FILE is operand of gl2psBeginPage.
> > Call of gl2psBeginPage function in my D code is in following function:
> > ________________________________________________________
> > extern (C) void
> > SaveFile(){
> > 	FILE* fp;
> > 	int state = GL2PS_OVERFLOW;
> > 	int buffsize = 0;
> > 
> > 	try{
> > 		fp = fopen("out.pdf", "wb");
> > 		while(state == GL2PS_OVERFLOW){
> > 			buffsize += 1024*1024;
> > 
> > 			gl2psBeginPage(
> > 				"test",
> > 				"gl2psTestSimple",
> > 				null,
> > 				GL2PS_PDF,
> > 				GL2PS_SIMPLE_SORT,
> > 				GL2PS_DRAW_BACKGROUND | GL2PS_USE_CURRENT_VIEWPORT,
> > 				GL_RGBA,
> > 				0,
> > 				null,
> > 				0,
> > 				0,
> > 				0,
> > 				buffsize,
> > 				fp,
> > 				"out.pdf"
> > 			);
> > 
> > 			RenderFrame();
> > 			state = gl2psEndPage();
> > 		}
> > 		fclose(fp);
> > 		MessageBoxA(null, "File saved", "Information", MB_OK | MB_ICONINFORMATION);
> > 	}
> > 	catch(Object o){
> > 		MessageBoxA(null, cast(char*)o.toString(), "Critical Error", MB_OK | MB_ICONERROR);
> > 	}
> > }
> > ________________________________________________________
> > exactly: gl2ps->stream = fp;
> > 
> 
> Have you tried debugging this code with ddbg, and checked what the actual values of gl2ps and gl2ps->stream are when it crashes?
> 
> http://ddbg.mainia.de/

I converted all gl2ps code to d and then started debugging with ddbg.
I have got a problem with allocating memory. I have got the following code:

if(gl2ps.bgcolor is cast(GL2PSrgba*)null){
    gl2ps.bgcolor = cast(GL2PSrgba*)malloc(GL2PSrgba.sizeof);
}

and error:
Unhandled Exception: EXCEPTION_ACCESS_VIOLATION(0xc0000005) at ?Alloc@RTLPool@@QAEPAXXZ (0x0042e8a9) thread(5368)

I don't know what does it mean.


May 25, 2008
Zarathustra wrote:
> torhu Wrote:
> 
>> Zarathustra wrote:
>> > 
>> > Oh, I find out something.
>> > The most crashes occur in similar calls (in DLL) like following:
>> > ________________________________________________________
>> > offs += fprintf(gl2ps->stream, "%%PDF-1.4\n");
>> > ________________________________________________________
>> > it looks like DLL haven't got access to FILE(gl2ps->stream), but why?
>> > The FILE is operand of gl2psBeginPage.
>> > Call of gl2psBeginPage function in my D code is in following function:
>> > ________________________________________________________
>> > extern (C) void
>> > SaveFile(){
>> > 	FILE* fp;
>> > 	int state = GL2PS_OVERFLOW;
>> > 	int buffsize = 0;
>> >             		
>> > 	try{
>> > 		fp = fopen("out.pdf", "wb");
>> > 		while(state == GL2PS_OVERFLOW){
>> > 			buffsize += 1024*1024;
>> > 
>> > 			gl2psBeginPage(
>> > 				"test", 				"gl2psTestSimple", 				null, 				GL2PS_PDF, 				GL2PS_SIMPLE_SORT,
>> > 				GL2PS_DRAW_BACKGROUND | GL2PS_USE_CURRENT_VIEWPORT,
>> > 				GL_RGBA, 				0, 				null, 				0, 				0, 				0, 				buffsize, 				fp, 				"out.pdf"
>> > 			);
>> > 			
>> > 			RenderFrame();
>> > 			state = gl2psEndPage();
>> > 		}
>> > 		fclose(fp);
>> > 		MessageBoxA(null, "File saved", "Information", MB_OK | MB_ICONINFORMATION);
>> > 	}
>> > 	catch(Object o){
>> > 		MessageBoxA(null, cast(char*)o.toString(), "Critical Error", MB_OK | MB_ICONERROR);
>> > 	}
>> > }
>> > ________________________________________________________
>> > exactly: gl2ps->stream = fp;
>> > 
>> 
>> Have you tried debugging this code with ddbg, and checked what the actual values of gl2ps and gl2ps->stream are when it crashes?
>> 
>> http://ddbg.mainia.de/
> 
> I converted all gl2ps code to d and then started debugging with ddbg.
> I have got a problem with allocating memory. I have got the following code:
> 
> if(gl2ps.bgcolor is cast(GL2PSrgba*)null){
>     gl2ps.bgcolor = cast(GL2PSrgba*)malloc(GL2PSrgba.sizeof);
> }
> 
> and error:
> Unhandled Exception: EXCEPTION_ACCESS_VIOLATION(0xc0000005) at ?Alloc@RTLPool@@QAEPAXXZ (0x0042e8a9) thread(5368)
> 
> I don't know what does it mean.
> 
> 

Does it crash on the malloc line?  Maybe you've got heap corruption. You could check for stray pointers or buffer overflows.  Maybe someone else recognizes this error and can tell you more, because I might be completely wrong about this.
May 25, 2008
torhu Wrote:

> Zarathustra wrote:
> > torhu Wrote:
> > 
> >> Zarathustra wrote:
> >> > 
> >> > Oh, I find out something.
> >> > The most crashes occur in similar calls (in DLL) like following:
> >> > ________________________________________________________
> >> > offs += fprintf(gl2ps->stream, "%%PDF-1.4\n");
> >> > ________________________________________________________
> >> > it looks like DLL haven't got access to FILE(gl2ps->stream), but why?
> >> > The FILE is operand of gl2psBeginPage.
> >> > Call of gl2psBeginPage function in my D code is in following function:
> >> > ________________________________________________________
> >> > extern (C) void
> >> > SaveFile(){
> >> > 	FILE* fp;
> >> > 	int state = GL2PS_OVERFLOW;
> >> > 	int buffsize = 0;
> >> > 
> >> > 	try{
> >> > 		fp = fopen("out.pdf", "wb");
> >> > 		while(state == GL2PS_OVERFLOW){
> >> > 			buffsize += 1024*1024;
> >> > 
> >> > 			gl2psBeginPage(
> >> > 				"test",
> >> > 				"gl2psTestSimple",
> >> > 				null,
> >> > 				GL2PS_PDF,
> >> > 				GL2PS_SIMPLE_SORT,
> >> > 				GL2PS_DRAW_BACKGROUND | GL2PS_USE_CURRENT_VIEWPORT,
> >> > 				GL_RGBA,
> >> > 				0,
> >> > 				null,
> >> > 				0,
> >> > 				0,
> >> > 				0,
> >> > 				buffsize,
> >> > 				fp,
> >> > 				"out.pdf"
> >> > 			);
> >> > 
> >> > 			RenderFrame();
> >> > 			state = gl2psEndPage();
> >> > 		}
> >> > 		fclose(fp);
> >> > 		MessageBoxA(null, "File saved", "Information", MB_OK | MB_ICONINFORMATION);
> >> > 	}
> >> > 	catch(Object o){
> >> > 		MessageBoxA(null, cast(char*)o.toString(), "Critical Error", MB_OK | MB_ICONERROR);
> >> > 	}
> >> > }
> >> > ________________________________________________________
> >> > exactly: gl2ps->stream = fp;
> >> > 
> >> 
> >> Have you tried debugging this code with ddbg, and checked what the actual values of gl2ps and gl2ps->stream are when it crashes?
> >> 
> >> http://ddbg.mainia.de/
> > 
> > I converted all gl2ps code to d and then started debugging with ddbg.
> > I have got a problem with allocating memory. I have got the following code:
> > 
> > if(gl2ps.bgcolor is cast(GL2PSrgba*)null){
> >     gl2ps.bgcolor = cast(GL2PSrgba*)malloc(GL2PSrgba.sizeof);
> > }
> > 
> > and error:
> > Unhandled Exception: EXCEPTION_ACCESS_VIOLATION(0xc0000005) at ?Alloc@RTLPool@@QAEPAXXZ (0x0042e8a9) thread(5368)
> > 
> > I don't know what does it mean.
> > 
> > 
> 
> Does it crash on the malloc line?  Maybe you've got heap corruption. You could check for stray pointers or buffer overflows.  Maybe someone else recognizes this error and can tell you more, because I might be completely wrong about this.

Ok I resolved this problem by change std.c.stdlib.malloc on std.gc.malloc.
But now I still have a problem with fprintf() functions.
code:
________________________________________________________
offs = fprintf(gl2ps.stream,
                 "1 0 obj\n<<\n/Title (%s)\n/Creator (GL2PS %d.%d.%d%s, %s)\n/Producer (%s)\n",
                 gl2ps.title, GL2PS_MAJOR_VERSION, GL2PS_MINOR_VERSION,
                 GL2PS_PATCH_VERSION, GL2PS_EXTRA_VERSION, GL2PS_COPYRIGHT,
                 gl2ps.producer);
________________________________________________________
Unhandled Exception: EXCEPTION_ACCESS_VIOLATION(0xc0000005) at _strlen (0x0042a37d) thread(3380)

but when I change it:
code
________________________________________________________
  offs = fprintf(gl2ps.stream,
                 /*"1 0 obj\n<<\n/Title (%s)\n/Creator (GL2PS %d.%d.%d%s, %s)\n/Producer (%s)\n",*/
                 gl2ps.title, GL2PS_MAJOR_VERSION, GL2PS_MINOR_VERSION,
                 GL2PS_PATCH_VERSION, GL2PS_EXTRA_VERSION, GL2PS_COPYRIGHT,
                 gl2ps.producer);
________________________________________________________
everything is ok :/, too long string or what?
May 25, 2008
On Sun, 25 May 2008 22:57:35 +0400, Zarathustra <adam.chrapkowski@gmail.com> wrote:

> Ok I resolved this problem by change std.c.stdlib.malloc on std.gc.malloc.
> But now I still have a problem with fprintf() functions.
> code:
> ________________________________________________________
> offs = fprintf(gl2ps.stream,
>                  "1 0 obj\n<<\n/Title (%s)\n/Creator (GL2PS %d.%d.%d%s, %s)\n/Producer (%s)\n",
>                  gl2ps.title, GL2PS_MAJOR_VERSION, GL2PS_MINOR_VERSION,
>                  GL2PS_PATCH_VERSION, GL2PS_EXTRA_VERSION, GL2PS_COPYRIGHT,
>                  gl2ps.producer);
> ________________________________________________________
> Unhandled Exception: EXCEPTION_ACCESS_VIOLATION(0xc0000005) at _strlen (0x0042a37d) thread(3380)
>
> but when I change it:
> code
> ________________________________________________________
>   offs = fprintf(gl2ps.stream,
>                  /*"1 0 obj\n<<\n/Title (%s)\n/Creator (GL2PS %d.%d.%d%s, %s)\n/Producer (%s)\n",*/
>                  gl2ps.title, GL2PS_MAJOR_VERSION, GL2PS_MINOR_VERSION,
>                  GL2PS_PATCH_VERSION, GL2PS_EXTRA_VERSION, GL2PS_COPYRIGHT,
>                  gl2ps.producer);
> ________________________________________________________
> everything is ok :/, too long string or what?

Looks like you provide a null-pointer as a string to fprintf...
May 26, 2008
Koroskin Denis Wrote:

> On Sun, 25 May 2008 22:57:35 +0400, Zarathustra <adam.chrapkowski@gmail.com> wrote:
> 
> > Ok I resolved this problem by change std.c.stdlib.malloc on
> > std.gc.malloc.
> > But now I still have a problem with fprintf() functions.
> > code:
> > ________________________________________________________
> > offs = fprintf(gl2ps.stream,
> >                  "1 0 obj\n<<\n/Title (%s)\n/Creator (GL2PS %d.%d.%d%s,
> > %s)\n/Producer (%s)\n",
> >                  gl2ps.title, GL2PS_MAJOR_VERSION, GL2PS_MINOR_VERSION,
> >                  GL2PS_PATCH_VERSION, GL2PS_EXTRA_VERSION,
> > GL2PS_COPYRIGHT,
> >                  gl2ps.producer);
> > ________________________________________________________
> > Unhandled Exception: EXCEPTION_ACCESS_VIOLATION(0xc0000005) at _strlen
> > (0x0042a37d) thread(3380)
> >
> > but when I change it:
> > code
> > ________________________________________________________
> >   offs = fprintf(gl2ps.stream,
> >                  /*"1 0 obj\n<<\n/Title (%s)\n/Creator (GL2PS
> > %d.%d.%d%s, %s)\n/Producer (%s)\n",*/
> >                  gl2ps.title, GL2PS_MAJOR_VERSION, GL2PS_MINOR_VERSION,
> >                  GL2PS_PATCH_VERSION, GL2PS_EXTRA_VERSION,
> > GL2PS_COPYRIGHT,
> >                  gl2ps.producer);
> > ________________________________________________________
> > everything is ok :/, too long string or what?
> 
> Looks like you provide a null-pointer as a string to fprintf...

Why Do you think that? When I shorten string then error don't occur. There didn't occur null pointers, I checked It before.
I think that interesting is the error "_strlen". Also interesting is that, why when I execute this code with C then everything is ok. How to check what does this error exactly mean? It looks like rate of data is too big for one fprintf() call.