intermittent seg fault : during geometry rendering

Started by
4 comments, last by venzon 16 years, 6 months ago
Hi Guys I have this weird problem of getting seg faults intermittently. I'm sure I'm doing something wrong during memory allocation or of that sort. But, can't figure out what.. Here's my code for setting up a NXN grid of triangles for possible terrain rendering:

void drawHmGrid()
{
  // define a NXN grid
	static const int gridX = 16;
	static const int gridY = 16;

	
	Mathbox *m = new Mathbox();			// new mathbox class
	int numfaces = (gridX-1) * (gridY-1) * 2;	// number of faces
	int numverts = 3;				// number of vertices per face
	int numcoords = 3;				// number of co-ordinates per vertex
	vec3 v[gridX*gridY];                            // vertices
        int index = 0;                                  // index
	int cnt =0;					// array counter	

	GLubyte order1[numfaces*numverts];
	int ct = 0;
	int counter = 1;

	for(int ix1=0; ix1 < (numfaces/2) * numverts; ix1+=3)
		{
		order1[ix1] = ct;
		//cout << ct << ", ";
		order1[ix1+1] = ct+1;
		//cout << ct+1 << ", ";
		order1[ix1+2] = ct+(gridY+1);
		//cout << ct+5 << endl;
		ct++;
		counter++;
		if(counter == gridY) {ct++; counter=1;}
		}
	
	//cout << "final ct= " << ct << endl;
	ct = ct + (gridY - 1);
	counter = 1;
	
	for(int ix1=(numfaces/2) * numverts; ix1 < numfaces * numverts; ix1+=3)
		{
		order1[ix1] = ct;
	        //cout << ct << ", ";
		order1[ix1+1] = ct-1;
		//cout << ct-1 << ", ";
		order1[ix1+2] = ct-(gridY+1);
		//cout << ct-5 << endl;
		ct--;
		counter++; 
		if(counter == gridY) {ct--; counter=1;}
		}

	//cout << "done." << endl;

	
	float *vtx = new float[numfaces * numverts * numcoords];//vertex array
	float *norm = new float[numfaces * numverts * numcoords];//normal array
	float *tex = new float[numfaces * numverts * numcoords];//texture array
	int vc = 0;
	
	for (int x=0; x<gridX; x++)				//height = 0 for testing geometry
		for(int y=0; y<gridY; y++)
		{
			v[index] = m->setVec3(x, y, findHeight(x, y));
			//v[index] = m->setVec3(x, y, 0.0);
			//cout << index << ". ";
			//m->printVec3(v[index]);
			index++;
		}


	for (int idx1 = 0; idx1 < numfaces; idx1++)
	{
		for (int idx2 = 0; idx2 < numverts; idx2++)
		{
			 vc = ( idx1 * numverts ) + idx2;
			for(int idx3 = 0; idx3 < numcoords; idx3++)
				{
					cnt = ( ((idx1 * numverts) + idx2) * numcoords );
					vtx[cnt] = v[ vc ].x;
					norm[cnt] = 0.0;
					cnt++;
					vtx[cnt] = v[ vc ].y;
					norm[cnt] = 0.0;
					cnt++;
					vtx[cnt] = v[ vc ].z;
					norm[cnt] = -1.0;
					cnt =0;
				}
		}	
	}

	// draw arrays
	glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
	
                //rendering the cube
                glEnableClientState(GL_VERTEX_ARRAY);
                glVertexPointer(3, GL_FLOAT, 0, &(vtx[0]));

                glEnableClientState(GL_NORMAL_ARRAY);
                glNormalPointer(GL_FLOAT, 0, &(norm[0]));

	glDrawElements(GL_TRIANGLES, numfaces * numcoords, GL_UNSIGNED_BYTE, order1);

		glDisableClientState(GL_VERTEX_ARRAY);
                //glDisableClientState(GL_TEXTURE_COORD_ARRAY);
                glDisableClientState(GL_NORMAL_ARRAY);


	//drawArrays(vtx, tex, norm, true, false, true, numfaces, numverts);
	glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
	
	delete(vtx);
	delete(tex);
	delete(norm);
	delete(m);	
}

It works sometimes, then annoyingly so it seg faults sometimes. If I just rerun the program (yes, without any change) its fine, seamless. I added the delete statements as I thought it might be because I didn't destroy the structures that I created. But, still no luck! [Edited by - rrarunan on October 14, 2007 9:11:54 AM]
Advertisement
If the program behaves differently between runs with the same inputs then it is exhibiting undefined behaviour. There are several cases for this, but perhaps the most common is uninitialised memory.

Your debugger will be far more helpful in fixing this problem than anybody reading your code. Find out at which line the access violation occurs and work backwards. Make sure you're using a debug build for the debugging process, or you'll probably do more harm than good.

If you're still stuck, tell us what compiler and settings you're using, which line the fault occurs at, which type of seg-fault it is (read, write or execute) and the linear address of the inaccessible memory.

Also, it's much easier on the eyes if you put your code inside [source] tags.

Admiral
Ring3 Circus - Diary of a programmer, journal of a hacker.
hey thanks Admiral

I will find the line causing the error and see what I can do.

Arunan
Try running your program through a memory profiler like valgrind. You also might want to try a debug allocator, possibly something like duma (http://duma.sourceforge.net/). You should also configure your system to write core files on the crashes. Doing these things will make it a lot easier to track down the memory corruption issue.

*Edit*

I also thought I'd add that in the past, I've seen unpredictable segfaults in glDrawElements when the parameters are wrong or if the opengl state is not set up properly before making the call.
stick all these just before u call glDrawElements
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
etc (color array texcoords etc) check the opengl spec for a full list

now it should work (but u wont see anything :) )
thus reenable one at a time + run the program (u will find out which one is causing the problem)

also draw elements with GL_UNSIGNED_BYTE seems wierd thats only 256 elemetns ( i assume u have more than that)
also for models u will want to share vertices if theyre in the same place, ie for each face dont create 3 seperate vertices
	float *vtx = new float[numfaces * numverts * numcoords];//vertex array	float *norm = new float[numfaces * numverts * numcoords];//normal array	float *tex = new float[numfaces * numverts * numcoords];//texture array	delete(vtx);	delete(tex);	delete(norm);


You're creating arrays with the new operator, so you need to delete them with:
delete [] vtx;delete [] tex;delete [] norm;


This will cause memory leaks.

[Edited by - venzon on October 17, 2007 11:34:17 AM]

This topic is closed to new replies.

Advertisement