Add backtrace log inside deadlocks

This commit is contained in:
Alex 2023-03-25 11:57:31 +02:00
parent 42bcdefc6b
commit 3aba6b4881
Signed by untrusted user who does not match committer: enderice2
GPG Key ID: EACC3AD603BAB4DD

View File

@ -5,6 +5,8 @@
#include "../kernel.h" #include "../kernel.h"
// #define PRINT_BACKTRACE
bool ForceUnlock = false; bool ForceUnlock = false;
Atomic<size_t> LocksCount = 0; Atomic<size_t> LocksCount = 0;
@ -31,6 +33,23 @@ void LockClass::DeadLock(SpinLockData Lock)
CPU::Interrupts(CPU::Check) ? "enabled" : "disabled", CPU::Interrupts(CPU::Check) ? "enabled" : "disabled",
CCore, Lock.Core, this->DeadLocks); CCore, Lock.Core, this->DeadLocks);
#ifdef PRINT_BACKTRACE
if (KernelSymbolTable)
{
debug("\t\t%s<-%s<-%s<-%s<-%s<-%s<-%s<-%s<-%s<-%s",
KernelSymbolTable->GetSymbolFromAddress((uintptr_t)__builtin_return_address(0)),
KernelSymbolTable->GetSymbolFromAddress((uintptr_t)__builtin_return_address(1)),
KernelSymbolTable->GetSymbolFromAddress((uintptr_t)__builtin_return_address(2)),
KernelSymbolTable->GetSymbolFromAddress((uintptr_t)__builtin_return_address(3)),
KernelSymbolTable->GetSymbolFromAddress((uintptr_t)__builtin_return_address(4)),
KernelSymbolTable->GetSymbolFromAddress((uintptr_t)__builtin_return_address(5)),
KernelSymbolTable->GetSymbolFromAddress((uintptr_t)__builtin_return_address(6)),
KernelSymbolTable->GetSymbolFromAddress((uintptr_t)__builtin_return_address(7)),
KernelSymbolTable->GetSymbolFromAddress((uintptr_t)__builtin_return_address(8)),
KernelSymbolTable->GetSymbolFromAddress((uintptr_t)__builtin_return_address(9)));
}
#endif
// TODO: Print on screen too. // TODO: Print on screen too.
this->DeadLocks++; this->DeadLocks++;
@ -103,6 +122,23 @@ void LockClass::TimeoutDeadLock(SpinLockData Lock, uint64_t Timeout)
CPU::Interrupts(CPU::Check) ? "enabled" : "disabled", CPU::Interrupts(CPU::Check) ? "enabled" : "disabled",
CCore, Lock.Core, Timeout, Timeout - Counter); CCore, Lock.Core, Timeout, Timeout - Counter);
#ifdef PRINT_BACKTRACE
if (KernelSymbolTable)
{
debug("\t\t%s<-%s<-%s<-%s<-%s<-%s<-%s<-%s<-%s<-%s",
KernelSymbolTable->GetSymbolFromAddress((uintptr_t)__builtin_return_address(0)),
KernelSymbolTable->GetSymbolFromAddress((uintptr_t)__builtin_return_address(1)),
KernelSymbolTable->GetSymbolFromAddress((uintptr_t)__builtin_return_address(2)),
KernelSymbolTable->GetSymbolFromAddress((uintptr_t)__builtin_return_address(3)),
KernelSymbolTable->GetSymbolFromAddress((uintptr_t)__builtin_return_address(4)),
KernelSymbolTable->GetSymbolFromAddress((uintptr_t)__builtin_return_address(5)),
KernelSymbolTable->GetSymbolFromAddress((uintptr_t)__builtin_return_address(6)),
KernelSymbolTable->GetSymbolFromAddress((uintptr_t)__builtin_return_address(7)),
KernelSymbolTable->GetSymbolFromAddress((uintptr_t)__builtin_return_address(8)),
KernelSymbolTable->GetSymbolFromAddress((uintptr_t)__builtin_return_address(9)));
}
#endif
if (Timeout < Counter) if (Timeout < Counter)
{ {
warn("Unlocking lock '%s' because of timeout. (%ld < %ld)", Lock.AttemptingToGet, Timeout, Counter); warn("Unlocking lock '%s' because of timeout. (%ld < %ld)", Lock.AttemptingToGet, Timeout, Counter);