Любое портирование, доступное для backtrace для uclibc? - PullRequest
10 голосов
/ 29 марта 2010

Мы запускаем uclibc linux на ARM 9. Проблема в том, что uclibc не поддерживает обратную трассировку. Когда происходит дамп ядра, я не могу получить стек вызовов.

У кого-нибудь есть хорошее решение для этого?

Например, существующий перенос backtrace для uclibc или любой хороший метод для захвата стека вызовов, когда происходит дамп ядра (uclibc + ARM + Linux)?

Ответы [ 2 ]

5 голосов
/ 29 марта 2010

Обновление:

Похоже, что патч был создан для поддержки backtrace() в uclibc для x86 и ARM (XScale) и использует символ __libc_stack_end.


Оригинальный ответ:

Я работал над проектом, в котором версия glibc, которую мы использовали, не обеспечивала функционал backtrace() для нашего процессора ARM, поэтому мы разработали нашу собственную версию glibc, используя символ __libc_stack_end. Ниже приведен полученный код. Возможно, вы можете использовать его для написания функции uclibc backtrace().

extern void * __libc_stack_end;

struct backtrace_frame_t
{
    void * fp;
    void * sp;
    void * lr;
    void * pc;
};

int backtrace(void ** array, int size)
{
    void * top_frame_p;
    void * current_frame_p;
    struct backtrace_frame_t * frame_p;
    int frame_count;

    top_frame_p = __builtin_frame_address(0);
    current_frame_p = top_frame_p;
    frame_p = (struct backtrace_frame_t*)((void**)(current_frame_p)-3);
    frame_count = 0;

    if (__builtin_return_address(0) != frame_p->lr)
    {
        fprintf(stderr, "backtrace error: __builtin_return_address(0) != frame_p->lr\n");
        return frame_count;
    }

    if (current_frame_p != NULL
        && current_frame_p > (void*)&frame_count
        && current_frame_p < __libc_stack_end)
    {
        while (frame_count < size
               && current_frame_p != NULL
               && current_frame_p > (void*)&frame_count
               && current_frame_p < __libc_stack_end)
        {
            frame_p = (struct backtrace_frame_t*)((void**)(current_frame_p)-3);
            array[frame_count] = frame_p->lr;
            frame_count++;
            current_frame_p = frame_p->fp;
        }
    }

    return frame_count;
}

Примечание. Символ __libc_stack_end больше не экспортируется в более поздних версиях glibc, и я не уверен в его наличии или аналогичном символе в uclibc.

1 голос
/ 11 ноября 2010

Посмотрите на тот же вопрос, заданный здесь:

http://lists.uclibc.org/pipermail/uclibc/2010-June/044115.html

который упоминает патч отсюда:

http://git.stlinux.com/?p=stm/uclibc.git;a=commit;h=d6a3d9ece5922a337800a8e2ed4db7e226f9ccb3

...