/
redgpu
/
ezEngine
Обзор
Документация
Войти
/
redgpu
/
ezEngine
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
dev
Code/Engine/Foundation/Platform/Android/StackTracer_Android.cpp
65 строк
1 KB
Ingrater
Clang-format fixes and update to 18.1.1 (#1234)
10 мар 2024, 15:51
Не верифицирован
10 мар 2024, 15:51
2f16acf
Код
Авторство
О чём код?
#include <Foundation/FoundationPCH.h> #if EZ_ENABLED(EZ_PLATFORM_ANDROID) # include <Foundation/System/StackTracer.h> # include <dlfcn.h> # include <unwind.h> void ezStackTracer::OnPluginEvent(const ezPluginEvent& e) {} struct Backtrace { ezUInt32 uiPos = 0; ezArrayPtr<void*> trace; }; static _Unwind_Reason_Code BacktraceCallback(struct _Unwind_Context* pContext, void* pData) { Backtrace& backtrace = *(Backtrace*)pData; if (backtrace.uiPos < backtrace.trace.GetCount()) { backtrace.trace[backtrace.uiPos] = reinterpret_cast<void*>(_Unwind_GetIP(pContext)); backtrace.uiPos++; return _URC_NO_REASON; } else { return _URC_END_OF_STACK; } } // static ezUInt32 ezStackTracer::GetStackTrace(ezArrayPtr<void*>& trace, void* pContext) { Backtrace backtrace; backtrace.trace = trace; _Unwind_Reason_Code res = _Unwind_Backtrace(BacktraceCallback, &backtrace); EZ_IGNORE_UNUSED(res); return backtrace.uiPos; } // static void ezStackTracer::ResolveStackTrace(const ezArrayPtr<void*>& trace, PrintFunc printFunc) { char szBuffer[512]; for (ezUInt32 i = 0; i < trace.GetCount(); i++) { Dl_info info; if (dladdr(trace[i], &info) && info.dli_sname) { int iLen = ezMath::Min(strlen(info.dli_sname), (size_t)EZ_ARRAY_SIZE(szBuffer) - 2); memcpy(szBuffer, info.dli_sname, iLen); szBuffer[iLen] = '\n'; szBuffer[iLen + 1] = '\0'; printFunc(szBuffer); } else { printFunc("Unresolved stack.\n"); } } } #endif