Age Owner Branch data TLA Line data Source code
1 : : /*-------------------------------------------------------------------------
2 : : *
3 : : * assert.c
4 : : * Assert support code.
5 : : *
6 : : * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
7 : : * Portions Copyright (c) 1994, Regents of the University of California
8 : : *
9 : : *
10 : : * IDENTIFICATION
11 : : * src/backend/utils/error/assert.c
12 : : *
13 : : *-------------------------------------------------------------------------
14 : : */
15 : : #include "postgres.h"
16 : :
17 : : #include <unistd.h>
18 : : #ifdef HAVE_EXECINFO_H
19 : : #include <execinfo.h>
20 : : #endif
21 : :
22 : : /*
23 : : * ExceptionalCondition - Handles the failure of an Assert()
24 : : *
25 : : * We intentionally do not go through elog() here, on the grounds of
26 : : * wanting to minimize the amount of infrastructure that has to be
27 : : * working to report an assertion failure.
28 : : */
29 : : void
6190 tgl@sss.pgh.pa.us 30 :UBC 0 : ExceptionalCondition(const char *conditionName,
31 : : const char *fileName,
32 : : int lineNumber)
33 : : {
34 : : /* Report the failure on stderr (or local equivalent) */
9716 bruce@momjian.us 35 [ # # ]: 0 : if (!PointerIsValid(conditionName)
552 tgl@sss.pgh.pa.us 36 [ # # ]: 0 : || !PointerIsValid(fileName))
1287 37 : 0 : write_stderr("TRAP: ExceptionalCondition: bad arguments in PID %d\n",
38 : 0 : (int) getpid());
39 : : else
552 40 : 0 : write_stderr("TRAP: failed Assert(\"%s\"), File: \"%s\", Line: %d, PID: %d\n",
41 : 0 : conditionName, fileName, lineNumber, (int) getpid());
42 : :
43 : : /* Usually this shouldn't be needed, but make sure the msg went out */
6190 44 : 0 : fflush(stderr);
45 : :
46 : : /* If we have support for it, dump a simple backtrace */
47 : : #ifdef HAVE_BACKTRACE_SYMBOLS
48 : : {
49 : : void *buf[100];
50 : : int nframes;
51 : :
1619 alvherre@alvh.no-ip. 52 : 0 : nframes = backtrace(buf, lengthof(buf));
53 : 0 : backtrace_symbols_fd(buf, nframes, fileno(stderr));
54 : : }
55 : : #endif
56 : :
57 : : /*
58 : : * If configured to do so, sleep indefinitely to allow user to attach a
59 : : * debugger. It would be nice to use pg_usleep() here, but that can sleep
60 : : * at most 2G usec or ~33 minutes, which seems too short.
61 : : */
62 : : #ifdef SLEEP_ON_ASSERT
63 : : sleep(1000000);
64 : : #endif
65 : :
7918 bruce@momjian.us 66 : 0 : abort();
67 : : }
|