problem debugging: stack frame corruption.
I am debugging a program, and just before calling a function I have
correct values for some local variables, and just entering the called
function, the values get corrupted.
the name of the function is adjacent_planes and it is called from
neig_particle<float>::getAreasVolume.
Just after stepping into adjacent_planes I have the following
situation:
gdb) up
#1 0x08050140 in neig_particle<float>::getAreasVolume
(this=0x80616c8, particles=0x80616c8, mynum=0, norbox=0x8055b00,
coefbox=0x8055b48, boxareas=0x805ff80) at particle.h:130
130 adjacent_planes(this->pos, normals, coefs,NUM_NEIGHBOURS
+6,is_adjacent,ptosfinales);
-----------------------------HERE---------------------------
(gdb) print is_adjacent
$23 = {UNDEF <repeats 32 times>}
---------------------------------------------------------------
(gdb) down
#0 adjacent_planes (ptoinicial=@0x80616d0, normals=0xbfffe940,
coefs=0xbfffe8b0, numplanes=32, is_adjacent=0xbfffe6b0,
ptosfinales=0xbfffe730) at 3dgeometry.cpp:236
236 vect3d<real> vini, v, ptoini, ptofinal;
(gdb) print is_adjacent
$24 = (Tknow *) 0xbfffe6b0
-----------------------------HERE---------------------------
(gdb) print (Tknow[32])is_adjacent
$25 = {3221218992, 3221219120, UNDEF <repeats 30 times>}
---------------------------------------------------------------
In the past I had the same problem with another program, and the
solution was to increase the stack size ( with bash: ulimit ). But now
this does not solve the problem, and I have no idea where or what the
problem could be. Does someone have any hint?
It all happens when I call p[j].getAreasVolume from the following
suroutine:
void calcula_fuerzas(int numpar, neig_particle<real> *p){
........
for(int j=0;j<numpar;j++) {
cerr<<"particula "<<j<<endl;
p[j].getAreasVolume(p,j,boxnormals,boxcoefs,boxareas);
}
.......
}
where:
#define real float
vect3d<real> boxnormals[6]; //vect3d is just an implementation of a
vector class for 3 dimensions.
real boxcoefs[6];
real (*boxareas)[6];
and:
//--------------------------------------------------------------------------
-----------------------
typedef enum {UNDEF,YES,NO} Tknow;
#define NUM_NEIGHBOURS 26
template<class real> class neig_particle: public particle<real>{
public:
struct{
int num;
real dist2;
Tknow is_adjacent;
real Area; //with the following field, Area will become useless.
} neighbour[NUM_NEIGHBOURS]; // Estara ordenado: el mas distante
sera el 0.
neig_particle():particle<real>(){
for (int i=0;i<NUM_NEIGHBOURS;i++)
neighbour[i].num=-1,neighbour[i].dist2=HUGE;
};
neig_particle(real mass, real temp):particle<real>(mass,temp){
for (int i=0;i<NUM_NEIGHBOURS;i++)
neighbour[i].num=-1,neighbour[i].dist2=HUGE;
};
void insert_ordly(int num, real dist);
void set_init_neigbours(int numpart,neig_particle *particles);
void update_neighbours(neig_particle *particles,int myself);
int is_neighbour(int candi);
int neighbourFind(int num) const ;
int neighbourFind(const neig_particle *p, const neig_particle
*particles) const ;
void getAreasVolume(neig_particle *particles, int mynum,
vect3d<real>* norbox, real *coefbox, real (*boxareas)[6]);
void adjacentUNDEF();
};
//-------------------------------------------------------------------------
// and:
//
-------------------------------------------------------------------------
template<class real> class particle{
real imass;
public:
real Mass;
vect3d<real> pos,vel;
vect3d<real> forces[3];
unsigned short whichforce;
particle(void){Mass=1.;imass=1.;whichforce=0;};
particle(real mass){Mass=mass;imass=1./mass;whichforce=0;};
void updateImass(void){imass=1./Mass;}
real invmass(void){return imass;};
real mass(void){return Mass;};
};
//-------------------------------------------------------------------------
template<class real> void neig_particle<real>::getAreasVolume(
neig_particle *particles, int mynum, vect3d<real>*
norbox, real *coefbox, real (*boxareas)[6]){
vect3d<real> normals[NUM_NEIGHBOURS+6];
real coefs[NUM_NEIGHBOURS+6];
// we fill normals and coefs with values:
for(int i=0;i<NUM_NEIGHBOURS; i++) if(neighbour[i].is_adjacent!
=NO) //Calculamos su ecuacion
GetEquiPlaneEcuation(this->pos, particles[neighbour[i].num].pos,
&normals[i], &coefs[i]);
for(int i=NUM_NEIGHBOURS;i<NUM_NEIGHBOURS+6; i++)
{
normals[i]=norbox[i-NUM_NEIGHBOURS];
coefs[i] =coefbox[i-NUM_NEIGHBOURS];
}
// Next we see if it is adjacent:
vect3d<real> ptosfinales[NUM_NEIGHBOURS+6];
Tknow is_adjacent[NUM_NEIGHBOURS+6];
// We give an initial value for is_adjacent:
for ( int i=0; i<NUM_NEIGHBOURS; i++ )
is_adjacent[i]=neighbour[i].is_adjacent;
for ( int i=NUM_NEIGHBOURS; i<NUM_NEIGHBOURS+6; i++ )
is_adjacent[i]=UNDEF;
//Here we modify information of is_adjacent and initialize
ptosfinales:
adjacent_planes(this->pos, normals, coefs,NUM_NEIGHBOURS
+6,is_adjacent,ptosfinales);
......... etc ....
};
debugging until adjacent_planes seems to be OK, but just steping into
the subroutine and the values for most of the arrays (normals, coefs,
is_adjacent) get corrupted.
the code for adjacent_planes is:
//-----------------------------------------------------------
void adjacent_planes(
const vect3d<real>& ptoinicial, // We start searching with this
point (central point)
vect3d<real> *normals, // The equations of the planes are given
by the points
real *coefs, // "r" that match the equation
normals*r=coefs. The
// normals should be directed pointing
outside of the
// region.
int numplanes, // Total number of planes and of elements
in normals
// and coefs.
Tknow *is_adjacent, // array. At input suppoused UNDEF, at exit, all
known.
vect3d<real> *ptosfinales // places belonging to a plane where they
are adjacent.
// (if they are found to be adjacent).
){
vect3d<real> vini, v, ptoini, ptofinal;
bool *is_banned= (bool *) xmalloc(numplanes*sizeof(*is_banned));
.....
free(is_banned);
}
Sorry for the length of the post.
Thanks for any help,
Cesar.
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]