www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Re: global static pointer variable in DLL

reply Zarathustra <adam.chrapkowski gmail.com> writes:
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
parent reply torhu <no spam.invalid> writes:
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
parent reply Zarathustra <adam.chrapkowski gmail.com> writes:
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
parent reply "Koroskin Denis" <2korden gmail.com> writes:
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 =3D 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 =3D 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 25 2008
parent Zarathustra <adam.chrapkowski gmail.com> writes:
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.
May 25 2008