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:
/*-------------------------------------------------------------------------
*
* 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
* IDENTIFICATION
* src/backend/utils/error/assert.c
*
- * NOTE
- * This should eventually work with elog()
- *
*-------------------------------------------------------------------------
*/
#include "postgres.h"
/*
* 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
