xref: /petsc/src/sys/error/errtrace.c (revision 3f6e4ae9eecaae8a44170722877b4a2c1d9ba4c4)
1e5c89e4eSSatish Balay #define PETSC_DLL
2e5c89e4eSSatish Balay 
3107894f0SSatish Balay #include "petscsys.h"        /*I "petscsys.h" I*/
4107894f0SSatish Balay #include "petscconfiginfo.h"
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 
48107894f0SSatish Balay /* ---------------------------------------------------------------------------------------*/
49107894f0SSatish Balay 
50107894f0SSatish Balay static char  arch[10],hostname[64],username[16],pname[PETSC_MAX_PATH_LEN],date[64];
51107894f0SSatish Balay static PetscTruth PetscErrorPrintfInitializeCalled = PETSC_FALSE;
52*3f6e4ae9SSatish Balay static char version[256];
53107894f0SSatish Balay 
54107894f0SSatish Balay #undef __FUNCT__
55107894f0SSatish Balay #define __FUNCT__ "PetscErrorPrintfInitialize"
56107894f0SSatish Balay /*
57107894f0SSatish Balay    Initializes arch, hostname, username,date so that system calls do NOT need
58107894f0SSatish Balay    to be made during the error handler.
59107894f0SSatish Balay */
60107894f0SSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscErrorPrintfInitialize()
61107894f0SSatish Balay {
62107894f0SSatish Balay   PetscErrorCode ierr;
63107894f0SSatish Balay 
64107894f0SSatish Balay   PetscFunctionBegin;
65107894f0SSatish Balay   ierr = PetscGetArchType(arch,10);CHKERRQ(ierr);
66107894f0SSatish Balay   ierr = PetscGetHostName(hostname,64);CHKERRQ(ierr);
67107894f0SSatish Balay   ierr = PetscGetUserName(username,16);CHKERRQ(ierr);
68107894f0SSatish Balay   ierr = PetscGetProgramName(pname,PETSC_MAX_PATH_LEN);CHKERRQ(ierr);
69107894f0SSatish Balay   ierr = PetscGetDate(date,64);CHKERRQ(ierr);
70*3f6e4ae9SSatish Balay   ierr = PetscGetVersion(&version,256);CHKERRQ(ierr);
71107894f0SSatish Balay   PetscErrorPrintfInitializeCalled = PETSC_TRUE;
72107894f0SSatish Balay   PetscFunctionReturn(0);
73107894f0SSatish Balay }
74107894f0SSatish Balay 
75107894f0SSatish Balay 
76e5c89e4eSSatish Balay 
77e5c89e4eSSatish Balay #undef __FUNCT__
78e5c89e4eSSatish Balay #define __FUNCT__ "PetscTraceBackErrorHandler"
79e5c89e4eSSatish Balay /*@C
80e5c89e4eSSatish Balay 
81e5c89e4eSSatish Balay    PetscTraceBackErrorHandler - Default error handler routine that generates
82e5c89e4eSSatish Balay    a traceback on error detection.
83e5c89e4eSSatish Balay 
84e5c89e4eSSatish Balay    Not Collective
85e5c89e4eSSatish Balay 
86e5c89e4eSSatish Balay    Input Parameters:
87e5c89e4eSSatish Balay +  line - the line number of the error (indicated by __LINE__)
88e5c89e4eSSatish Balay .  func - the function where error is detected (indicated by __FUNCT__)
89e5c89e4eSSatish Balay .  file - the file in which the error was detected (indicated by __FILE__)
90e5c89e4eSSatish Balay .  dir - the directory of the file (indicated by __SDIR__)
91e5c89e4eSSatish Balay .  mess - an error text string, usually just printed to the screen
92e5c89e4eSSatish Balay .  n - the generic error number
93e5c89e4eSSatish Balay .  p - specific error number
94e5c89e4eSSatish Balay -  ctx - error handler context
95e5c89e4eSSatish Balay 
96e5c89e4eSSatish Balay    Level: developer
97e5c89e4eSSatish Balay 
98e5c89e4eSSatish Balay    Notes:
99e5c89e4eSSatish Balay    Most users need not directly employ this routine and the other error
100e5c89e4eSSatish Balay    handlers, but can instead use the simplified interface SETERRQ, which has
101e5c89e4eSSatish Balay    the calling sequence
102e5c89e4eSSatish Balay $     SETERRQ(number,p,mess)
103e5c89e4eSSatish Balay 
104e5c89e4eSSatish Balay    Notes for experienced users:
105e5c89e4eSSatish Balay    Use PetscPushErrorHandler() to set the desired error handler.  The
106e5c89e4eSSatish Balay    currently available PETSc error handlers include PetscTraceBackErrorHandler(),
107e5c89e4eSSatish Balay    PetscAttachDebuggerErrorHandler(), PetscAbortErrorHandler(), and PetscStopErrorHandler()
108e5c89e4eSSatish Balay 
109e5c89e4eSSatish Balay    Concepts: error handler^traceback
110e5c89e4eSSatish Balay    Concepts: traceback^generating
111e5c89e4eSSatish Balay 
112e5c89e4eSSatish Balay .seealso:  PetscPushErrorHandler(), PetscAttachDebuggerErrorHandler(),
113e5c89e4eSSatish Balay           PetscAbortErrorHandler()
114e5c89e4eSSatish Balay  @*/
115e5c89e4eSSatish 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)
116e5c89e4eSSatish Balay {
117e5c89e4eSSatish Balay   PetscLogDouble    mem,rss;
118e5c89e4eSSatish Balay   PetscTruth        flg1,flg2;
119107894f0SSatish Balay   PetscErrorCode    ierr;
120e5c89e4eSSatish Balay 
121e5c89e4eSSatish Balay   PetscFunctionBegin;
122e5c89e4eSSatish Balay 
123e5c89e4eSSatish Balay   if (p == 1) {
124107894f0SSatish Balay     (*PetscErrorPrintf)("--------------------- Error Message ------------------------------------\n");
125e5c89e4eSSatish Balay     if (n == PETSC_ERR_MEM) {
126e5c89e4eSSatish Balay       (*PetscErrorPrintf)("Out of memory. This could be due to allocating\n");
127e5c89e4eSSatish Balay       (*PetscErrorPrintf)("too large an object or bleeding by not properly\n");
128e5c89e4eSSatish Balay       (*PetscErrorPrintf)("destroying unneeded objects.\n");
129e5c89e4eSSatish Balay       PetscMallocGetCurrentUsage(&mem);
130e5c89e4eSSatish Balay       PetscMemoryGetCurrentUsage(&rss);
131e5c89e4eSSatish Balay       PetscOptionsHasName(PETSC_NULL,"-malloc_dump",&flg1);
132e5c89e4eSSatish Balay       PetscOptionsHasName(PETSC_NULL,"-malloc_log",&flg2);
133e5c89e4eSSatish Balay       if (flg2) {
134e5c89e4eSSatish Balay         PetscMallocDumpLog(stdout);
135e5c89e4eSSatish Balay       } else {
136e5c89e4eSSatish Balay         (*PetscErrorPrintf)("Memory allocated %D Memory used by process %D\n",(PetscInt)mem,(PetscInt)rss);
137e5c89e4eSSatish Balay         if (flg1) {
138e5c89e4eSSatish Balay           PetscMallocDump(stdout);
139e5c89e4eSSatish Balay         } else {
140e5c89e4eSSatish Balay           (*PetscErrorPrintf)("Try running with -malloc_dump or -malloc_log for info.\n");
141e5c89e4eSSatish Balay         }
142e5c89e4eSSatish Balay       }
143e5c89e4eSSatish Balay     } else {
144e5c89e4eSSatish Balay         const char *text;
145e5c89e4eSSatish Balay         PetscErrorMessage(n,&text,PETSC_NULL);
146e5c89e4eSSatish Balay         if (text) (*PetscErrorPrintf)("%s!\n",text);
147e5c89e4eSSatish Balay     }
148e5c89e4eSSatish Balay     if (mess) {
149e5c89e4eSSatish Balay       (*PetscErrorPrintf)("%s!\n",mess);
150e5c89e4eSSatish Balay     }
151107894f0SSatish Balay     (*PetscErrorPrintf)("------------------------------------------------------------------------\n");
152107894f0SSatish Balay     (*PetscErrorPrintf)("%s\n",version);
153107894f0SSatish Balay     (*PetscErrorPrintf)("See docs/changes/index.html for recent updates.\n");
154107894f0SSatish Balay     (*PetscErrorPrintf)("See docs/faq.html for hints about trouble shooting.\n");
155107894f0SSatish Balay     (*PetscErrorPrintf)("See docs/index.html for manual pages.\n");
156107894f0SSatish Balay     (*PetscErrorPrintf)("------------------------------------------------------------------------\n");
157107894f0SSatish Balay     if (PetscErrorPrintfInitializeCalled) {
158107894f0SSatish Balay       (*PetscErrorPrintf)("%s on a %s named %s by %s %s\n",pname,arch,hostname,username,date);
159e5c89e4eSSatish Balay     }
160107894f0SSatish Balay     (*PetscErrorPrintf)("Libraries linked from %s\n",PETSC_LIB_DIR);
161107894f0SSatish Balay     (*PetscErrorPrintf)("Configure run at %s\n",petscconfigureruntime);
162107894f0SSatish Balay     (*PetscErrorPrintf)("Configure options %s\n",petscconfigureoptions);
163107894f0SSatish Balay     (*PetscErrorPrintf)("------------------------------------------------------------------------\n");
164107894f0SSatish Balay   }
165107894f0SSatish Balay 
166107894f0SSatish Balay 
167107894f0SSatish Balay   /* first line in stack trace? */
168f5ad10bcSSatish Balay   (*PetscErrorPrintf)("%s() line %d in %s%s\n",fun,line,dir,file);
169107894f0SSatish Balay 
170107894f0SSatish Balay 
171e5c89e4eSSatish Balay   PetscFunctionReturn(n);
172e5c89e4eSSatish Balay }
173e5c89e4eSSatish Balay 
174