Hook up backtraces on android.

git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4251 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
Cory McWilliams 2023-03-29 22:25:17 +00:00
parent e86b9dae48
commit 20b0337e0a

View File

@ -14,11 +14,11 @@
#include <string.h>
#ifndef _WIN32
#ifndef __ANDROID__
#if defined(__ANDROID__)
#include <unwind.h>
#elif !defined(_WIN32)
#include <execinfo.h>
#endif
#endif
static JSValue _util_utf8_encode(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv)
{
@ -469,13 +469,41 @@ const char* tf_util_backtrace_string()
return tf_util_backtrace_to_string(buffer, count);
}
#if defined(__ANDROID__)
typedef struct _android_backtrace_t
{
void** current;
void** end;
} android_backtrace_t;
static _Unwind_Reason_Code _android_unwind_callback(struct _Unwind_Context* context, void* arg)
{
android_backtrace_t* state = arg;
uintptr_t pc = _Unwind_GetIP(context);
if (pc)
{
if (state->current == state->end)
{
return _URC_END_OF_STACK;
}
else
{
*state->current++ = (void*)pc;
}
}
return _URC_NO_REASON;
}
#endif
int tf_util_backtrace(void** buffer, int count)
{
#ifdef _WIN32
return CaptureStackBackTrace(0, count, buffer, NULL);
#elif !defined(__ANDROID__)
return backtrace(buffer, count);
#elif defined(__ANDROID__)
android_backtrace_t state = { .current = buffer, .end = buffer + count };
_Unwind_Backtrace(_android_unwind_callback, &state);
return state.current - buffer;
#else
return 0;
return backtrace(buffer, count);
#endif
}