Include the process PID in assertion-failure messages.
authorTom Lane <[email protected]>
Mon, 5 Oct 2020 17:40:28 +0000 (13:40 -0400)
committerTom Lane <[email protected]>
Mon, 5 Oct 2020 17:40:28 +0000 (13:40 -0400)
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

src/backend/utils/error/assert.c

index 4dfa3269238f07166a6e530fef8ec701d5f6e247..a8c0a8ec487c930ec5fdd5169512ea221b59cb18 100644 (file)
@@ -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"
 
 /*
  * 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