Commit 18c170a0 authored by Tom Lane's avatar Tom Lane

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
parent 53c6daff
/*------------------------------------------------------------------------- /*-------------------------------------------------------------------------
* *
* assert.c * assert.c
* Assert code. * Assert support code.
* *
* Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
...@@ -10,9 +10,6 @@ ...@@ -10,9 +10,6 @@
* IDENTIFICATION * IDENTIFICATION
* src/backend/utils/error/assert.c * src/backend/utils/error/assert.c
* *
* NOTE
* This should eventually work with elog()
*
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
#include "postgres.h" #include "postgres.h"
...@@ -24,6 +21,10 @@ ...@@ -24,6 +21,10 @@
/* /*
* ExceptionalCondition - Handles the failure of an Assert() * 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 void
ExceptionalCondition(const char *conditionName, ExceptionalCondition(const char *conditionName,
...@@ -31,20 +32,21 @@ ExceptionalCondition(const char *conditionName, ...@@ -31,20 +32,21 @@ ExceptionalCondition(const char *conditionName,
const char *fileName, const char *fileName,
int lineNumber) int lineNumber)
{ {
/* Report the failure on stderr (or local equivalent) */
if (!PointerIsValid(conditionName) if (!PointerIsValid(conditionName)
|| !PointerIsValid(fileName) || !PointerIsValid(fileName)
|| !PointerIsValid(errorType)) || !PointerIsValid(errorType))
write_stderr("TRAP: ExceptionalCondition: bad arguments\n"); write_stderr("TRAP: ExceptionalCondition: bad arguments in PID %d\n",
(int) getpid());
else else
{ write_stderr("TRAP: %s(\"%s\", File: \"%s\", Line: %d, PID: %d)\n",
write_stderr("TRAP: %s(\"%s\", File: \"%s\", Line: %d)\n",
errorType, conditionName, errorType, conditionName,
fileName, lineNumber); fileName, lineNumber, (int) getpid());
}
/* Usually this shouldn't be needed, but make sure the msg went out */ /* Usually this shouldn't be needed, but make sure the msg went out */
fflush(stderr); fflush(stderr);
/* If we have support for it, dump a simple backtrace */
#ifdef HAVE_BACKTRACE_SYMBOLS #ifdef HAVE_BACKTRACE_SYMBOLS
{ {
void *buf[100]; void *buf[100];
...@@ -55,12 +57,12 @@ ExceptionalCondition(const char *conditionName, ...@@ -55,12 +57,12 @@ ExceptionalCondition(const char *conditionName,
} }
#endif #endif
#ifdef SLEEP_ON_ASSERT
/* /*
* It would be nice to use pg_usleep() here, but only does 2000 sec or 33 * If configured to do so, sleep indefinitely to allow user to attach a
* minutes, which seems too short. * 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); sleep(1000000);
#endif #endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment