Add separate Platform::GetStackTrace and Platform::GetStackFrames
This commit is contained in:
@@ -202,11 +202,11 @@ void PlatformBase::Fatal(const Char* msg, void* context)
|
|||||||
LOG(Error, "");
|
LOG(Error, "");
|
||||||
|
|
||||||
// Log stack trace
|
// Log stack trace
|
||||||
const auto stackTrace = Platform::GetStackTrace(context ? 0 : 1, 60, context);
|
const auto stackFrames = Platform::GetStackFrames(context ? 0 : 1, 60, context);
|
||||||
if (stackTrace.HasItems())
|
if (stackFrames.HasItems())
|
||||||
{
|
{
|
||||||
LOG(Error, "Stack trace:");
|
LOG(Error, "Stack trace:");
|
||||||
for (const auto& frame : stackTrace)
|
for (const auto& frame : stackFrames)
|
||||||
{
|
{
|
||||||
char chr = 0;
|
char chr = 0;
|
||||||
int32 num = StringUtils::Length(frame.ModuleName);
|
int32 num = StringUtils::Length(frame.ModuleName);
|
||||||
@@ -217,11 +217,11 @@ void PlatformBase::Fatal(const Char* msg, void* context)
|
|||||||
if (StringUtils::Length(frame.FileName) != 0)
|
if (StringUtils::Length(frame.FileName) != 0)
|
||||||
{
|
{
|
||||||
StringAsUTF16<ARRAY_COUNT(StackFrame::FileName)> fileName(frame.FileName);
|
StringAsUTF16<ARRAY_COUNT(StackFrame::FileName)> fileName(frame.FileName);
|
||||||
LOG(Error, " at {0}!{1} in {2}:line {3}", moduleName.Get(), functionName.Get(), fileName.Get(), frame.LineNumber);
|
LOG(Error, " at {0}!{1}() in {2}:line {3}", moduleName.Get(), functionName.Get(), fileName.Get(), frame.LineNumber);
|
||||||
}
|
}
|
||||||
else if (StringUtils::Length(frame.FunctionName) != 0)
|
else if (StringUtils::Length(frame.FunctionName) != 0)
|
||||||
{
|
{
|
||||||
LOG(Error, " at {0}::{1}", moduleName.Get(), functionName.Get());
|
LOG(Error, " at {0}!{1}()", moduleName.Get(), functionName.Get());
|
||||||
}
|
}
|
||||||
else if (StringUtils::Length(frame.ModuleName) != 0)
|
else if (StringUtils::Length(frame.ModuleName) != 0)
|
||||||
{
|
{
|
||||||
@@ -483,11 +483,35 @@ int32 PlatformBase::RunProcess(const StringView& cmdLine, const StringView& work
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
Array<PlatformBase::StackFrame> PlatformBase::GetStackTrace(int32 skipCount, int32 maxDepth, void* context)
|
Array<PlatformBase::StackFrame> PlatformBase::GetStackFrames(int32 skipCount, int32 maxDepth, void* context)
|
||||||
{
|
{
|
||||||
return Array<StackFrame>();
|
return Array<StackFrame>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String PlatformBase::GetStackTrace(int32 skipCount, int32 maxDepth, void* context)
|
||||||
|
{
|
||||||
|
StringBuilder result;
|
||||||
|
Array<StackFrame> stackFrames = Platform::GetStackFrames(skipCount, maxDepth, context);
|
||||||
|
for (const auto& frame : stackFrames)
|
||||||
|
{
|
||||||
|
StringAsUTF16<ARRAY_COUNT(StackFrame::FunctionName)> functionName(frame.FunctionName);
|
||||||
|
if (StringUtils::Length(frame.FileName) != 0)
|
||||||
|
{
|
||||||
|
StringAsUTF16<ARRAY_COUNT(StackFrame::FileName)> fileName(frame.FileName);
|
||||||
|
result.AppendFormat(TEXT(" at {0}() in {1}:line {2}\n"), functionName.Get(), fileName.Get(), frame.LineNumber);
|
||||||
|
}
|
||||||
|
else if (StringUtils::Length(frame.FunctionName) != 0)
|
||||||
|
{
|
||||||
|
result.AppendFormat(TEXT(" at {0}()\n"), functionName.Get());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result.AppendFormat(TEXT(" at 0x{0:x}\n"), (uint64)frame.ProgramCounter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
void PlatformBase::CollectCrashData(const String& crashDataFolder, void* context)
|
void PlatformBase::CollectCrashData(const String& crashDataFolder, void* context)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -804,7 +804,16 @@ public:
|
|||||||
/// <param name="maxDepth">The maximum depth of the stack to collect. Can be used to prevent too long stack traces in case of stack overflow exception.</param>
|
/// <param name="maxDepth">The maximum depth of the stack to collect. Can be used to prevent too long stack traces in case of stack overflow exception.</param>
|
||||||
/// <param name="context">The platform-dependent context for the stack trace collecting (eg. platform exception info).</param>
|
/// <param name="context">The platform-dependent context for the stack trace collecting (eg. platform exception info).</param>
|
||||||
/// <returns>The collected stack trace frames. Empty if not supported (eg. platform not implements this feature or not supported in the distributed build).</returns>
|
/// <returns>The collected stack trace frames. Empty if not supported (eg. platform not implements this feature or not supported in the distributed build).</returns>
|
||||||
static Array<StackFrame, HeapAllocation> GetStackTrace(int32 skipCount = 0, int32 maxDepth = 60, void* context = nullptr);
|
static Array<StackFrame, HeapAllocation> GetStackFrames(int32 skipCount = 0, int32 maxDepth = 60, void* context = nullptr);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets current native stack trace information as string.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="skipCount">The amount of stack frames to skip from the beginning. Can be used to skip the callee function from the trace (eg. in crash handler).</param>
|
||||||
|
/// <param name="maxDepth">The maximum depth of the stack to collect. Can be used to prevent too long stack traces in case of stack overflow exception.</param>
|
||||||
|
/// <param name="context">The platform-dependent context for the stack trace collecting (eg. platform exception info).</param>
|
||||||
|
/// <returns>The collected stack trace printed into string. Empty if not supported (eg. platform not implements this feature or not supported in the distributed build).</returns>
|
||||||
|
static String GetStackTrace(int32 skipCount = 0, int32 maxDepth = 60, void* context = nullptr);
|
||||||
|
|
||||||
// Crash dump data handling
|
// Crash dump data handling
|
||||||
static void CollectCrashData(const String& crashDataFolder, void* context = nullptr);
|
static void CollectCrashData(const String& crashDataFolder, void* context = nullptr);
|
||||||
|
|||||||
@@ -1107,7 +1107,7 @@ void* WindowsPlatform::LoadLibrary(const Char* filename)
|
|||||||
return handle;
|
return handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
Array<PlatformBase::StackFrame> WindowsPlatform::GetStackTrace(int32 skipCount, int32 maxDepth, void* context)
|
Array<PlatformBase::StackFrame> WindowsPlatform::GetStackFrames(int32 skipCount, int32 maxDepth, void* context)
|
||||||
{
|
{
|
||||||
Array<StackFrame> result;
|
Array<StackFrame> result;
|
||||||
#if CRASH_LOG_ENABLE
|
#if CRASH_LOG_ENABLE
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ public:
|
|||||||
static int32 RunProcess(const StringView& cmdLine, const StringView& workingDir, const Dictionary<String, String>& environment, bool hiddenWindow = true);
|
static int32 RunProcess(const StringView& cmdLine, const StringView& workingDir, const Dictionary<String, String>& environment, bool hiddenWindow = true);
|
||||||
static Window* CreateWindow(const CreateWindowSettings& settings);
|
static Window* CreateWindow(const CreateWindowSettings& settings);
|
||||||
static void* LoadLibrary(const Char* filename);
|
static void* LoadLibrary(const Char* filename);
|
||||||
static Array<StackFrame, HeapAllocation> GetStackTrace(int32 skipCount = 0, int32 maxDepth = 60, void* context = nullptr);
|
static Array<StackFrame, HeapAllocation> GetStackFrames(int32 skipCount = 0, int32 maxDepth = 60, void* context = nullptr);
|
||||||
#if CRASH_LOG_ENABLE
|
#if CRASH_LOG_ENABLE
|
||||||
static void CollectCrashData(const String& crashDataFolder, void* context = nullptr);
|
static void CollectCrashData(const String& crashDataFolder, void* context = nullptr);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user