[petsc-users] Verifying matching PetscFunctionBeginUser() and PetscFunctionReturn()
Barry Smith
bsmith at petsc.dev
Tue Jul 11 23:45:30 CDT 2023
#define PetscStackPop_Private(stack__, func__) \
do { \
PetscCheckAbort(!stack__.check || stack__.currentsize > 0, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Invalid stack size %d, pop %s %s:%d.\n", stack__.currentsize, func__, __FILE__, __LINE__); \
if (--stack__.currentsize < PETSCSTACKSIZE) { \
PetscCheckAbort(!stack__.check || stack__.petscroutine[stack__.currentsize] != 1 || stack__.function[stack__.currentsize] == (const char *)(func__), PETSC_COMM_SELF, PETSC_ERR_PLIB, "Invalid stack: push from %s %s:%d. Pop from %s %s:%d.\n", \
stack__.function[stack__.currentsize], stack__.file[stack__.currentsize], stack__.line[stack__.currentsize], func__, __FILE__, __LINE__); \
It is checking on each pop (return) that the current function it is in is the same function that the begin was called in.
You do not have to call through PetscCall() to have this stuff work (though we strong recommend adding them).
Even if you have a return and no outstanding begins it should not crash
Maybe you need to see a couple of crashes so we try to figure out what is going on.
> On Jul 11, 2023, at 11:29 PM, Aagaard, Brad T via petsc-users <petsc-users at mcs.anl.gov> wrote:
>
> PETSc developers,
>
> When I fail to have matching PetscFunctionBeginUser() and PetscFunctionReturn() in my code, I get segfaults and valgrind reports invalid writes at places in PETSc where memory is freed. As a result, it is difficult to track down the actual source of the error. I know there used to be a command line argument for checking for mismatches in PetscFunctionBeginUser() and PetscFunctionReturn(), but Matt said it is no longer implemented and the reporting is supposed to be automatic when debugging is turned on. This automatic reporting does not seem to be working for me.
>
> Is there a test in PETSc of this automatic reporting that I can run to verify it works in my build?
>
> Are there any additional requirements for this automatic reporting of mismatched PetscFunctionBeginUser() and PetscFunctionReturn() in my code? Must I wrap all PETSc function calls with PetscCall()?
>
> Thanks,
> Brad
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20230712/94cb8ab2/attachment-0001.html>
More information about the petsc-users
mailing list