mirror of
https://github.com/Fennix-Project/Kernel.git
synced 2025-05-28 07:24:37 +00:00
Print backtrace on deadlocks
This commit is contained in:
parent
953401c4b2
commit
59ebcdfa8e
@ -22,10 +22,57 @@
|
|||||||
|
|
||||||
#include "../kernel.h"
|
#include "../kernel.h"
|
||||||
|
|
||||||
// #define PRINT_BACKTRACE
|
#ifdef DEBUG
|
||||||
|
#define PRINT_BACKTRACE
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef PRINT_BACKTRACE
|
#ifdef PRINT_BACKTRACE
|
||||||
#pragma GCC diagnostic ignored "-Wframe-address"
|
#pragma GCC diagnostic ignored "-Wframe-address"
|
||||||
|
|
||||||
|
void PrintStacktrace(LockClass::SpinLockData *Lock)
|
||||||
|
{
|
||||||
|
if (KernelSymbolTable)
|
||||||
|
{
|
||||||
|
struct StackFrame
|
||||||
|
{
|
||||||
|
uintptr_t BasePointer;
|
||||||
|
uintptr_t ReturnAddress;
|
||||||
|
};
|
||||||
|
|
||||||
|
char DbgAttempt[1024] = "\0";
|
||||||
|
char DbgHolder[1024] = "\0";
|
||||||
|
|
||||||
|
StackFrame *FrameAttempt = (StackFrame *)Lock->StackPointerAttempt.load();
|
||||||
|
StackFrame *FrameHolder = (StackFrame *)Lock->StackPointerHolder.load();
|
||||||
|
|
||||||
|
while (Memory::Virtual().Check(FrameAttempt))
|
||||||
|
{
|
||||||
|
sprintf(DbgAttempt + strlen(DbgAttempt), "%s<-", KernelSymbolTable->GetSymbolFromAddress(FrameAttempt->ReturnAddress));
|
||||||
|
FrameAttempt = (StackFrame *)FrameAttempt->BasePointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (Memory::Virtual().Check(FrameHolder))
|
||||||
|
{
|
||||||
|
sprintf(DbgHolder + strlen(DbgHolder), "%s<-", KernelSymbolTable->GetSymbolFromAddress(FrameHolder->ReturnAddress));
|
||||||
|
FrameHolder = (StackFrame *)FrameHolder->BasePointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
debug("Attempt: %s", DbgAttempt);
|
||||||
|
debug("Holder: %s", DbgHolder);
|
||||||
|
|
||||||
|
// 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
|
#endif
|
||||||
|
|
||||||
bool ForceUnlock = false;
|
bool ForceUnlock = false;
|
||||||
@ -55,20 +102,7 @@ void LockClass::DeadLock(SpinLockData Lock)
|
|||||||
CCore, Lock.Core, this->DeadLocks);
|
CCore, Lock.Core, this->DeadLocks);
|
||||||
|
|
||||||
#ifdef PRINT_BACKTRACE
|
#ifdef PRINT_BACKTRACE
|
||||||
if (KernelSymbolTable)
|
PrintStacktrace(&Lock);
|
||||||
{
|
|
||||||
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
|
#endif
|
||||||
|
|
||||||
// TODO: Print on screen too.
|
// TODO: Print on screen too.
|
||||||
@ -144,20 +178,7 @@ void LockClass::TimeoutDeadLock(SpinLockData Lock, uint64_t Timeout)
|
|||||||
CCore, Lock.Core, Timeout, Timeout - Counter);
|
CCore, Lock.Core, Timeout, Timeout - Counter);
|
||||||
|
|
||||||
#ifdef PRINT_BACKTRACE
|
#ifdef PRINT_BACKTRACE
|
||||||
if (KernelSymbolTable)
|
PrintStacktrace(&Lock);
|
||||||
{
|
|
||||||
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
|
#endif
|
||||||
|
|
||||||
if (Timeout < Counter)
|
if (Timeout < Counter)
|
||||||
|
@ -38,6 +38,7 @@ size_t GetLocksCount();
|
|||||||
/** @brief Please use this macro to create a new lock. */
|
/** @brief Please use this macro to create a new lock. */
|
||||||
class LockClass
|
class LockClass
|
||||||
{
|
{
|
||||||
|
public:
|
||||||
struct SpinLockData
|
struct SpinLockData
|
||||||
{
|
{
|
||||||
std::atomic_uint64_t LockData = 0x0;
|
std::atomic_uint64_t LockData = 0x0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user