обратный след для Ulibc в руке - PullRequest
2 голосов
/ 29 октября 2010

Я хотел знать, доступен ли какой-либо перенос для реализации обратной трассировки для uclibc in arm, который я могу использовать в своем обработчике сигналов для отладки ошибок сегментации.

Я наткнулся на полезный код здесь и попытался использовать его в моем обработчике сигналов, но он не дает результатов при первой проверке и возвращает оттуда.

Я также попробовал рекурсивную функцию обратного отслеживания, которая просто рекурсивно использовала (current_frame_p) -3), пока она не стала NULL и напечатала (current_frame_p) -1). Кажется, это тоже вызывает у меня проблемы. Все, что я получаю, это адрес обработчика и какой-то большой мусорный адрес (я предполагаю, что это может быть адрес сигнала). Но я не иду дальше этого. Я хочу, чтобы мой след вышел за пределы этого.

Сбой кода специально написан для отладки по разыменованию и неверному адресу.

Любая помощь будет высоко ценится.

Большое спасибо заранее.

-Keshav

Ответы [ 2 ]

3 голосов
/ 08 ноября 2010

Мы используем следующий код на устройстве 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;
}
0 голосов
/ 05 июля 2012

Я знаю, что вопрос был о uclibc, но я узнал, как заставить backtrace работать с glibc, поэтому я подумал, что скажу. Используйте "gcc -funwind-tables -rdynamic". Опция unwind-tables заставляет libc: backtrace () работать, а динамическая опция заставляет libc: backtrace_symbols () работать.

...