Мы используем следующий код на устройстве Arm (однако glibc).Я нашел этот код пару лет назад (не помню, где именно).Работает просто отлично, без проблем.
void __printBacktrace(int skipCount,bool segv=false)
{
int * func_addresses[BACKTRACE_MAXDEPTH];
char demangle_output[1000];
int nfuncs = __arm_backtrace(func_addresses, BACKTRACE_MAXDEPTH );
printf("----- Start Stack Trace -----\n");
for (int i = skipCount; i < nfuncs; ++i)
{
Dl_info info;
if (dladdr(func_addresses[i], &info))
{
int dStat;
size_t dLength = 1000;
char * demangled = abi::__cxa_demangle(info.dli_sname,
demangle_output, &dLength, &dStat);
if (demangled && !dStat)
printf(
"return addr: %p: object:%s %p symbol:%s [%p+0x%x]\n",
func_addresses[i], info.dli_fname, info.dli_fbase,
demangled, info.dli_saddr, (int) func_addresses[i]
- (int) info.dli_saddr);
else
printf(
"return addr: %p: object:%s %p symbol:%s [%p+0x%x]\n",
func_addresses[i], info.dli_fname, info.dli_fbase,
info.dli_sname, info.dli_saddr, (int) func_addresses[i]
- (int) info.dli_saddr);
} else
fprintf(fCrash, "return addr: %p\n", func_addresses[i]);
}
printf("----- End Stack Trace -----\n");
}
и
int __arm_backtrace(int **arr, int maxsize)
{
int cnt = 0;
void *fp = __builtin_frame_address(0);
struct layout *lp = (struct layout *) ((char*) fp - 12);
while (cnt < maxsize)
{
arr[cnt++] = (int *) lp->return_address;
if (!lp->next)
{
break;
}
lp = lp->next - 1;
}
return cnt;
}