diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
index 1337eabb3a5cc3129cf11fd6b0fd17f0a4ae31ae..a5fa1d4720af4d8d0631fd23d11a7618e1208cdc 100644
--- a/src/backend/postmaster/postmaster.c
+++ b/src/backend/postmaster/postmaster.c
@@ -2850,6 +2850,9 @@ reaper(SIGNAL_ARGS)
 				 */
 				Assert(Shutdown > NoShutdown);
 
+				elog(LOG, "checkpointer dead at %s",
+					 current_time_as_str());
+
 				/* Waken archiver for the last time */
 				if (PgArchPID != 0)
 					signal_child(PgArchPID, SIGUSR2);
@@ -3711,6 +3714,9 @@ PostmasterStateMachine(void)
 			if (ReachedNormalRunning)
 				CancelBackup();
 
+			elog(LOG, "all children dead at %s",
+				 current_time_as_str());
+
 			/* Normal exit from the postmaster is here */
 			ExitPostmaster(0);
 		}
diff --git a/src/backend/storage/ipc/ipc.c b/src/backend/storage/ipc/ipc.c
index cc36b80699b4997cd46baaaef49aa23b5bca3d24..8db5f9ed326546664e4323e5f2710a4dcc88f6db 100644
--- a/src/backend/storage/ipc/ipc.c
+++ b/src/backend/storage/ipc/ipc.c
@@ -98,6 +98,8 @@ static int	on_proc_exit_index,
 void
 proc_exit(int code)
 {
+	bool noisy = AmCheckpointerProcess() || (getpid() == PostmasterPid);
+
 	/* Clean up everything that must be cleaned up */
 	proc_exit_prepare(code);
 
@@ -140,6 +142,10 @@ proc_exit(int code)
 
 	elog(DEBUG3, "exit(%d)", code);
 
+	if (noisy)
+		elog(LOG, "calling exit(%d) at %s",
+			 code, current_time_as_str());
+
 	exit(code);
 }
 
@@ -151,6 +157,8 @@ proc_exit(int code)
 static void
 proc_exit_prepare(int code)
 {
+	bool noisy = AmCheckpointerProcess() || (getpid() == PostmasterPid);
+
 	/*
 	 * Once we set this flag, we are committed to exit.  Any ereport() will
 	 * NOT send control back to the main loop, but right back here.
@@ -197,8 +205,13 @@ proc_exit_prepare(int code)
 	 * possible.
 	 */
 	while (--on_proc_exit_index >= 0)
+	{
+		if (noisy)
+			elog(LOG, "doing on_proc_exit %d at %s",
+				 on_proc_exit_index, current_time_as_str());
 		(*on_proc_exit_list[on_proc_exit_index].function) (code,
 								  on_proc_exit_list[on_proc_exit_index].arg);
+	}
 
 	on_proc_exit_index = 0;
 }
@@ -214,6 +227,8 @@ proc_exit_prepare(int code)
 void
 shmem_exit(int code)
 {
+	bool noisy = AmCheckpointerProcess() || (getpid() == PostmasterPid);
+
 	/*
 	 * Call before_shmem_exit callbacks.
 	 *
@@ -225,8 +240,13 @@ shmem_exit(int code)
 	elog(DEBUG3, "shmem_exit(%d): %d before_shmem_exit callbacks to make",
 		 code, before_shmem_exit_index);
 	while (--before_shmem_exit_index >= 0)
+	{
+		if (noisy)
+			elog(LOG, "doing before_shmem_exit %d at %s",
+				 before_shmem_exit_index, current_time_as_str());
 		(*before_shmem_exit_list[before_shmem_exit_index].function) (code,
 						before_shmem_exit_list[before_shmem_exit_index].arg);
+	}
 	before_shmem_exit_index = 0;
 
 	/*
@@ -258,8 +278,13 @@ shmem_exit(int code)
 	elog(DEBUG3, "shmem_exit(%d): %d on_shmem_exit callbacks to make",
 		 code, on_shmem_exit_index);
 	while (--on_shmem_exit_index >= 0)
+	{
+		if (noisy)
+			elog(LOG, "doing on_shmem_exit %d at %s",
+				 on_shmem_exit_index, current_time_as_str());
 		(*on_shmem_exit_list[on_shmem_exit_index].function) (code,
 								on_shmem_exit_list[on_shmem_exit_index].arg);
+	}
 	on_shmem_exit_index = 0;
 }