xref: /petsc/src/sys/error/errtrace.c (revision f5ad10bcaccd2325c4d8965282b288be8a09912f)
1e5c89e4eSSatish Balay #define PETSC_DLL
2e5c89e4eSSatish Balay 
3e5c89e4eSSatish Balay #include "petsc.h"           /*I "petsc.h" I*/
4e5c89e4eSSatish Balay 
5e5c89e4eSSatish Balay 
6e5c89e4eSSatish Balay #undef __FUNCT__
7e5c89e4eSSatish Balay #define __FUNCT__ "PetscIgnoreErrorHandler"
8e5c89e4eSSatish Balay /*@C
9e5c89e4eSSatish Balay    PetscIgnoreErrorHandler - Ignores the error, allows program to continue as if error did not occure
10e5c89e4eSSatish Balay 
11e5c89e4eSSatish Balay    Not Collective
12e5c89e4eSSatish Balay 
13e5c89e4eSSatish Balay    Input Parameters:
14e5c89e4eSSatish Balay +  line - the line number of the error (indicated by __LINE__)
15e5c89e4eSSatish Balay .  func - the function where error is detected (indicated by __FUNCT__)
16e5c89e4eSSatish Balay .  file - the file in which the error was detected (indicated by __FILE__)
17e5c89e4eSSatish Balay .  dir - the directory of the file (indicated by __SDIR__)
18e5c89e4eSSatish Balay .  mess - an error text string, usually just printed to the screen
19e5c89e4eSSatish Balay .  n - the generic error number
20e5c89e4eSSatish Balay .  p - specific error number
21e5c89e4eSSatish Balay -  ctx - error handler context
22e5c89e4eSSatish Balay 
23e5c89e4eSSatish Balay    Level: developer
24e5c89e4eSSatish Balay 
25e5c89e4eSSatish Balay    Notes:
26e5c89e4eSSatish Balay    Most users need not directly employ this routine and the other error
27e5c89e4eSSatish Balay    handlers, but can instead use the simplified interface SETERRQ, which has
28e5c89e4eSSatish Balay    the calling sequence
29e5c89e4eSSatish Balay $     SETERRQ(number,p,mess)
30e5c89e4eSSatish Balay 
31e5c89e4eSSatish Balay    Notes for experienced users:
32e5c89e4eSSatish Balay    Use PetscPushErrorHandler() to set the desired error handler.  The
33e5c89e4eSSatish Balay    currently available PETSc error handlers include PetscTraceBackErrorHandler(),
34e5c89e4eSSatish Balay    PetscAttachDebuggerErrorHandler(), PetscAbortErrorHandler(), and PetscStopErrorHandler()
35e5c89e4eSSatish Balay 
36e5c89e4eSSatish Balay    Concepts: error handler^traceback
37e5c89e4eSSatish Balay    Concepts: traceback^generating
38e5c89e4eSSatish Balay 
39e5c89e4eSSatish Balay .seealso:  PetscPushErrorHandler(), PetscAttachDebuggerErrorHandler(),
40e5c89e4eSSatish Balay           PetscAbortErrorHandler(), PetscTraceBackErrorHandler()
41e5c89e4eSSatish Balay  @*/
42e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscIgnoreErrorHandler(int line,const char *fun,const char* file,const char *dir,PetscErrorCode n,int p,const char *mess,void *ctx)
43e5c89e4eSSatish Balay {
44e5c89e4eSSatish Balay   PetscFunctionBegin;
45e5c89e4eSSatish Balay   PetscFunctionReturn(n);
46e5c89e4eSSatish Balay }
47e5c89e4eSSatish Balay 
48e5c89e4eSSatish Balay 
49e5c89e4eSSatish Balay #undef __FUNCT__
50e5c89e4eSSatish Balay #define __FUNCT__ "PetscTraceBackErrorHandler"
51e5c89e4eSSatish Balay /*@C
52e5c89e4eSSatish Balay 
53e5c89e4eSSatish Balay    PetscTraceBackErrorHandler - Default error handler routine that generates
54e5c89e4eSSatish Balay    a traceback on error detection.
55e5c89e4eSSatish Balay 
56e5c89e4eSSatish Balay    Not Collective
57e5c89e4eSSatish Balay 
58e5c89e4eSSatish Balay    Input Parameters:
59e5c89e4eSSatish Balay +  line - the line number of the error (indicated by __LINE__)
60e5c89e4eSSatish Balay .  func - the function where error is detected (indicated by __FUNCT__)
61e5c89e4eSSatish Balay .  file - the file in which the error was detected (indicated by __FILE__)
62e5c89e4eSSatish Balay .  dir - the directory of the file (indicated by __SDIR__)
63e5c89e4eSSatish Balay .  mess - an error text string, usually just printed to the screen
64e5c89e4eSSatish Balay .  n - the generic error number
65e5c89e4eSSatish Balay .  p - specific error number
66e5c89e4eSSatish Balay -  ctx - error handler context
67e5c89e4eSSatish Balay 
68e5c89e4eSSatish Balay    Level: developer
69e5c89e4eSSatish Balay 
70e5c89e4eSSatish Balay    Notes:
71e5c89e4eSSatish Balay    Most users need not directly employ this routine and the other error
72e5c89e4eSSatish Balay    handlers, but can instead use the simplified interface SETERRQ, which has
73e5c89e4eSSatish Balay    the calling sequence
74e5c89e4eSSatish Balay $     SETERRQ(number,p,mess)
75e5c89e4eSSatish Balay 
76e5c89e4eSSatish Balay    Notes for experienced users:
77e5c89e4eSSatish Balay    Use PetscPushErrorHandler() to set the desired error handler.  The
78e5c89e4eSSatish Balay    currently available PETSc error handlers include PetscTraceBackErrorHandler(),
79e5c89e4eSSatish Balay    PetscAttachDebuggerErrorHandler(), PetscAbortErrorHandler(), and PetscStopErrorHandler()
80e5c89e4eSSatish Balay 
81e5c89e4eSSatish Balay    Concepts: error handler^traceback
82e5c89e4eSSatish Balay    Concepts: traceback^generating
83e5c89e4eSSatish Balay 
84e5c89e4eSSatish Balay .seealso:  PetscPushErrorHandler(), PetscAttachDebuggerErrorHandler(),
85e5c89e4eSSatish Balay           PetscAbortErrorHandler()
86e5c89e4eSSatish Balay  @*/
87e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscTraceBackErrorHandler(int line,const char *fun,const char* file,const char *dir,PetscErrorCode n,int p,const char *mess,void *ctx)
88e5c89e4eSSatish Balay {
89e5c89e4eSSatish Balay   PetscLogDouble    mem,rss;
90e5c89e4eSSatish Balay   PetscTruth        flg1,flg2;
91e5c89e4eSSatish Balay 
92e5c89e4eSSatish Balay   PetscFunctionBegin;
93e5c89e4eSSatish Balay 
94e5c89e4eSSatish Balay   if (p == 1) {
95*f5ad10bcSSatish Balay     (*PetscErrorPrintf)("--------------- Error Message --------------\n");
96e5c89e4eSSatish Balay     if (n == PETSC_ERR_MEM) {
97e5c89e4eSSatish Balay       (*PetscErrorPrintf)("Out of memory. This could be due to allocating\n");
98e5c89e4eSSatish Balay       (*PetscErrorPrintf)("too large an object or bleeding by not properly\n");
99e5c89e4eSSatish Balay       (*PetscErrorPrintf)("destroying unneeded objects.\n");
100e5c89e4eSSatish Balay       PetscMallocGetCurrentUsage(&mem);
101e5c89e4eSSatish Balay       PetscMemoryGetCurrentUsage(&rss);
102e5c89e4eSSatish Balay       PetscOptionsHasName(PETSC_NULL,"-malloc_dump",&flg1);
103e5c89e4eSSatish Balay       PetscOptionsHasName(PETSC_NULL,"-malloc_log",&flg2);
104e5c89e4eSSatish Balay       if (flg2) {
105e5c89e4eSSatish Balay         PetscMallocDumpLog(stdout);
106e5c89e4eSSatish Balay       } else {
107e5c89e4eSSatish Balay         (*PetscErrorPrintf)("Memory allocated %D Memory used by process %D\n",(PetscInt)mem,(PetscInt)rss);
108e5c89e4eSSatish Balay         if (flg1) {
109e5c89e4eSSatish Balay           PetscMallocDump(stdout);
110e5c89e4eSSatish Balay         } else {
111e5c89e4eSSatish Balay           (*PetscErrorPrintf)("Try running with -malloc_dump or -malloc_log for info.\n");
112e5c89e4eSSatish Balay         }
113e5c89e4eSSatish Balay       }
114e5c89e4eSSatish Balay     } else {
115e5c89e4eSSatish Balay         const char *text;
116e5c89e4eSSatish Balay         PetscErrorMessage(n,&text,PETSC_NULL);
117e5c89e4eSSatish Balay         if (text) (*PetscErrorPrintf)("%s!\n",text);
118e5c89e4eSSatish Balay     }
119e5c89e4eSSatish Balay     if (mess) {
120e5c89e4eSSatish Balay       (*PetscErrorPrintf)("%s!\n",mess);
121e5c89e4eSSatish Balay     }
122*f5ad10bcSSatish Balay     (*PetscErrorPrintf)("--------------------------------------------\n");
123e5c89e4eSSatish Balay   }
124*f5ad10bcSSatish Balay   (*PetscErrorPrintf)("%s() line %d in %s%s\n",fun,line,dir,file);
125e5c89e4eSSatish Balay   PetscFunctionReturn(n);
126e5c89e4eSSatish Balay }
127e5c89e4eSSatish Balay 
128