mirror of
				https://github.com/ggml-org/llama.cpp.git
				synced 2025-10-31 08:51:55 +00:00 
			
		
		
		
	added android implementation of ggml_print_backtrace_symbols (#8751)
* added android implementation of ggml_print_backtrace_symbols * Update ggml/src/ggml.c Co-authored-by: slaren <slarengh@gmail.com> * Update ggml/src/ggml.c Co-authored-by: slaren <slarengh@gmail.com> * Update ggml/src/ggml.c Co-authored-by: slaren <slarengh@gmail.com> * Update ggml/src/ggml.c Co-authored-by: slaren <slarengh@gmail.com> * Update ggml/src/ggml.c Co-authored-by: slaren <slarengh@gmail.com> --------- Co-authored-by: slaren <slarengh@gmail.com>
This commit is contained in:
		| @@ -141,7 +141,51 @@ typedef pthread_t ggml_thread_t; | |||||||
|  |  | ||||||
| #include <sys/wait.h> | #include <sys/wait.h> | ||||||
|  |  | ||||||
| #if defined(__linux__) | #if defined(__ANDROID__) | ||||||
|  | #include <unwind.h> | ||||||
|  | #include <dlfcn.h> | ||||||
|  | #include <stdio.h> | ||||||
|  |  | ||||||
|  | struct backtrace_state { | ||||||
|  |     void ** current; | ||||||
|  |     void ** end; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | static _Unwind_Reason_Code unwind_callback(struct _Unwind_Context* context, void* arg) { | ||||||
|  |     struct backtrace_state * state = (struct backtrace_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; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static void ggml_print_backtrace_symbols(void) { | ||||||
|  |     const int max = 100; | ||||||
|  |     void* buffer[max]; | ||||||
|  |  | ||||||
|  |     struct backtrace_state state = {buffer, buffer + max}; | ||||||
|  |     _Unwind_Backtrace(unwind_callback, &state); | ||||||
|  |  | ||||||
|  |     int count = state.current - buffer; | ||||||
|  |  | ||||||
|  |     for (int idx = 0; idx < count; ++idx) { | ||||||
|  |         const void * addr = buffer[idx]; | ||||||
|  |         const char * symbol = ""; | ||||||
|  |  | ||||||
|  |         Dl_info info; | ||||||
|  |         if (dladdr(addr, &info) && info.dli_sname) { | ||||||
|  |             symbol = info.dli_sname; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         fprintf(stderr, "%d: %p %s\n", idx, addr, symbol); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | #elif defined(__linux__) | ||||||
| #include <execinfo.h> | #include <execinfo.h> | ||||||
| static void ggml_print_backtrace_symbols(void) { | static void ggml_print_backtrace_symbols(void) { | ||||||
|     void * trace[100]; |     void * trace[100]; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 l3utterfly
					l3utterfly