forked from cory/tildefriends
		
	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:
		| @@ -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 | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user