aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/error/assert.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2020-10-05 13:40:28 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2020-10-05 13:40:28 -0400
commit18c170a08ee23d03a06d235ea628fecb057d974f (patch)
tree304af6ef08751684950a1769fad33c1e63f77d19 /src/backend/utils/error/assert.c
parent53c6daff4364219256119fcd79b2d71b57c13e37 (diff)
downloadpostgresql-18c170a08ee23d03a06d235ea628fecb057d974f.tar.gz
postgresql-18c170a08ee23d03a06d235ea628fecb057d974f.zip
Include the process PID in assertion-failure messages.
This should help to identify what happened when studying the postmaster log after-the-fact. While here, clean up some old comments in the same function. Discussion: https://postgr.es/m/1568983.1601845687@sss.pgh.pa.us
Diffstat (limited to 'src/backend/utils/error/assert.c')
-rw-r--r--src/backend/utils/error/assert.c28
1 files changed, 15 insertions, 13 deletions
diff --git a/src/backend/utils/error/assert.c b/src/backend/utils/error/assert.c
index 4dfa3269238..a8c0a8ec487 100644
--- a/src/backend/utils/error/assert.c
+++ b/src/backend/utils/error/assert.c
@@ -1,7 +1,7 @@
/*-------------------------------------------------------------------------
*
* assert.c
- * Assert code.
+ * Assert support code.
*
* Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
@@ -10,9 +10,6 @@
* IDENTIFICATION
* src/backend/utils/error/assert.c
*
- * NOTE
- * This should eventually work with elog()
- *
*-------------------------------------------------------------------------
*/
#include "postgres.h"
@@ -24,6 +21,10 @@
/*
* ExceptionalCondition - Handles the failure of an Assert()
+ *
+ * We intentionally do not go through elog() here, on the grounds of
+ * wanting to minimize the amount of infrastructure that has to be
+ * working to report an assertion failure.
*/
void
ExceptionalCondition(const char *conditionName,
@@ -31,20 +32,21 @@ ExceptionalCondition(const char *conditionName,
const char *fileName,
int lineNumber)
{
+ /* Report the failure on stderr (or local equivalent) */
if (!PointerIsValid(conditionName)
|| !PointerIsValid(fileName)
|| !PointerIsValid(errorType))
- write_stderr("TRAP: ExceptionalCondition: bad arguments\n");
+ write_stderr("TRAP: ExceptionalCondition: bad arguments in PID %d\n",
+ (int) getpid());
else
- {
- write_stderr("TRAP: %s(\"%s\", File: \"%s\", Line: %d)\n",
+ write_stderr("TRAP: %s(\"%s\", File: \"%s\", Line: %d, PID: %d)\n",
errorType, conditionName,
- fileName, lineNumber);
- }
+ fileName, lineNumber, (int) getpid());
/* Usually this shouldn't be needed, but make sure the msg went out */
fflush(stderr);
+ /* If we have support for it, dump a simple backtrace */
#ifdef HAVE_BACKTRACE_SYMBOLS
{
void *buf[100];
@@ -55,12 +57,12 @@ ExceptionalCondition(const char *conditionName,
}
#endif
-#ifdef SLEEP_ON_ASSERT
-
/*
- * It would be nice to use pg_usleep() here, but only does 2000 sec or 33
- * minutes, which seems too short.
+ * If configured to do so, sleep indefinitely to allow user to attach a
+ * debugger. It would be nice to use pg_usleep() here, but that can sleep
+ * at most 2G usec or ~33 minutes, which seems too short.
*/
+#ifdef SLEEP_ON_ASSERT
sleep(1000000);
#endif