From 2559d1719f531242a3d010406a4747d74a7239c0 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 8 Aug 2023 14:56:54 +0100 Subject: [PATCH] All pocketmine\thread\Thread now log uncaught exceptions and fatal errors by default --- src/network/mcpe/raklib/RakLibServer.php | 6 +----- src/scheduler/AsyncWorker.php | 5 ----- src/thread/CommonThreadPartsTrait.php | 16 ++++++++++++++-- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/network/mcpe/raklib/RakLibServer.php b/src/network/mcpe/raklib/RakLibServer.php index e59b6971f..e2d6d9a66 100644 --- a/src/network/mcpe/raklib/RakLibServer.php +++ b/src/network/mcpe/raklib/RakLibServer.php @@ -85,6 +85,7 @@ class RakLibServer extends Thread{ gc_enable(); ini_set("display_errors", '1'); ini_set("display_startup_errors", '1'); + \GlobalLogger::set($this->logger); $socket = new ServerSocket($this->address->deserialize()); $manager = new Server( @@ -107,11 +108,6 @@ class RakLibServer extends Thread{ $manager->waitShutdown(); } - protected function onUncaughtException(\Throwable $e) : void{ - parent::onUncaughtException($e); - $this->logger->logException($e); - } - public function getThreadName() : string{ return "RakLib"; } diff --git a/src/scheduler/AsyncWorker.php b/src/scheduler/AsyncWorker.php index b26afc29b..919e3eedc 100644 --- a/src/scheduler/AsyncWorker.php +++ b/src/scheduler/AsyncWorker.php @@ -69,11 +69,6 @@ class AsyncWorker extends Worker{ $this->saveToThreadStore(self::TLS_KEY_NOTIFIER, $this->sleeperEntry->createNotifier()); } - protected function onUncaughtException(\Throwable $e) : void{ - parent::onUncaughtException($e); - $this->logger->logException($e); - } - public function getLogger() : ThreadSafeLogger{ return $this->logger; } diff --git a/src/thread/CommonThreadPartsTrait.php b/src/thread/CommonThreadPartsTrait.php index e7429be9b..f5cd8fe0a 100644 --- a/src/thread/CommonThreadPartsTrait.php +++ b/src/thread/CommonThreadPartsTrait.php @@ -115,6 +115,7 @@ trait CommonThreadPartsTrait{ protected function onUncaughtException(\Throwable $e) : void{ $this->synchronized(function() use ($e) : void{ $this->crashInfo = ThreadCrashInfo::fromThrowable($e, $this->getThreadName()); + \GlobalLogger::get()->logException($e); }); } @@ -128,11 +129,22 @@ trait CommonThreadPartsTrait{ $last = error_get_last(); if($last !== null){ //fatal error - $this->crashInfo = ThreadCrashInfo::fromLastErrorInfo($last, $this->getThreadName()); + $crashInfo = ThreadCrashInfo::fromLastErrorInfo($last, $this->getThreadName()); }else{ //probably misused exit() - $this->crashInfo = ThreadCrashInfo::fromThrowable(new \RuntimeException("Thread crashed without an error - perhaps exit() was called?"), $this->getThreadName()); + $crashInfo = ThreadCrashInfo::fromThrowable(new \RuntimeException("Thread crashed without an error - perhaps exit() was called?"), $this->getThreadName()); } + $this->crashInfo = $crashInfo; + + $lines = []; + //mimic exception printed format + $lines[] = "Fatal error: " . $crashInfo->makePrettyMessage(); + $lines[] = "--- Stack trace ---"; + foreach($crashInfo->getTrace() as $frame){ + $lines[] = " " . $frame->getPrintableFrame(); + } + $lines[] = "--- End of fatal error information ---"; + \GlobalLogger::get()->critical(implode("\n", $lines)); } }); }