[petsc-users] Seg fault in gdb but program runs

Satish Balay balay at mcs.anl.gov
Tue Dec 13 07:38:13 CST 2022


suggest running your code with valgrind

Satish

On Mon, 12 Dec 2022, Matthew Knepley wrote:

> On Mon, Dec 12, 2022 at 9:56 PM Yuyun Yang <yyang85 at alumni.stanford.edu>
> wrote:
> 
> > Hello team,
> >
> >
> >
> > I’m debugging my code using gdb. The program runs just fine if I don’t
> > debug it, but when I use gdb, it seg faults at a place where it never
> > experienced any seg fault when I debugged it 1-2 years ago. I wonder if
> > this might be caused by the PETSc version change?
> >
> 
> The only PETSc calls are the MatGetOwnershipRange() calls, which have not
> changed, so I think this is unlikely.
> 
> 
> > Or something wrong with gdb itself? I’ve included the code block that is
> > problematic for you to take a look at what might be wrong – seg fault
> > happens when this function is called. For context, Spmat is a class of
> > sparse matrices in the code:
> >
> 
> What is the debugger output?
> 
>   Thanks,
> 
>     Matt
> 
> 
> > // calculate the exact nonzero structure which results from the kronecker
> > outer product of left and right
> >
> >
> > // d_nnz = diagonal nonzero structure, o_nnz = off-diagonal nonzero
> > structure
> >
> > void kronConvert_symbolic(const Spmat &left, const Spmat &right, Mat &mat,
> > PetscInt* d_nnz, PetscInt* o_nnz)
> >
> >
> > {
> >
> >
> >   size_t rightRowSize = right.size(1);
> >
> >
> >   size_t rightColSize = right.size(2);
> >
> >
> >
> >
> >
> >   PetscInt Istart,Iend; // rows owned by current processor
> >
> >
> >   PetscInt Jstart,Jend; // cols owned by current processor
> >
> >
> >
> >
> >
> >   // allocate space for mat
> >
> >
> >   MatGetOwnershipRange(mat,&Istart,&Iend);
> >
> >
> >   MatGetOwnershipRangeColumn(mat,&Jstart,&Jend);
> >
> >
> >   PetscInt m = Iend - Istart;
> >
> >
> >
> >
> >
> >   for (int ii=0; ii<m; ii++) { d_nnz[ii] = 0; }
> >
> >
> >   for (int ii=0; ii<m; ii++) { o_nnz[ii] = 0; }
> >
> >
> >
> >
> >
> >   // iterate over only nnz entries
> >
> >
> >   Spmat::const_row_iter IiL,IiR;
> >
> >
> >   Spmat::const_col_iter JjL,JjR;
> >
> >
> >   double valL=0, valR=0, val=0;
> >
> >
> >   PetscInt row,col;
> >
> >
> >   size_t rowL,colL,rowR,colR;
> >
> >
> >
> >
> >   // loop over all values in left
> >
> >
> >   for (IiL=left._mat.begin(); IiL!=left._mat.end(); IiL++) {
> >
> >
> >     for (JjL=(IiL->second).begin(); JjL!=(IiL->second).end(); JjL++) {
> >
> >
> >       rowL = IiL->first;
> >
> >
> >       colL = JjL->first;
> >
> >
> >       valL = JjL->second;
> >
> >
> >       if (valL==0) { continue; }
> >
> >
> >
> >
> >
> >       // loop over all values in right
> >
> >
> >       for (IiR=right._mat.begin(); IiR!=right._mat.end(); IiR++) {
> >
> >
> >         for (JjR=(IiR->second).begin(); JjR!=(IiR->second).end(); JjR++)
> > {
> >
> >           rowR = IiR->first;
> >
> >
> >           colR = JjR->first;
> >
> >
> >           valR = JjR->second;
> >
> >
> >
> >
> >
> >           // the new values and coordinates for the product matrix
> >
> >
> >           val = valL*valR;
> >
> >
> >           row = rowL*rightRowSize + rowR;
> >
> >
> >           col = colL*rightColSize + colR;
> >
> >
> >
> >
> >
> >           PetscInt ii = row - Istart; // array index for d_nnz and o_nnz
> >
> >
> >           if (val!=0 && row >= Istart && row < Iend && col >= Jstart &&
> > col < Jend) { d_nnz[ii]++; \
> >
> > }
> >
> >
> >           if ( (val!=0 && row >= Istart && row < Iend) && (col < Jstart
> > || col >= Jend) ) { o_nnz[i\
> >
> > i]++; }
> >
> >
> >         }
> >
> >
> >       }
> >
> >
> >     }
> >
> >
> >   }
> >
> >
> > }
> >
> >
> >
> >
> >
> >
> >
> > Thank you,
> >
> > Yuyun
> >
> 
> 
> 


More information about the petsc-users mailing list