2010-03-29 2 views
10

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

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

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

ответ

5

Update:

Кажется, что patch был создан для поддержки 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.

+0

из приведенного выше кода я получаю сообщение об ошибке выполнения «трассировку ошибка : __builtin_return_address (0)! = frame_p-> lr ". как разрешить это условие. – Mandar

+0

Стандартное соглашение о вызове ARM ([pdf link] (http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042d/IHI0042D_aapcs.pdf)) выделяет r14 в качестве регистра ссылок. Инструкция BL, используемая в вызове подпрограммы, сохраняет адрес возврата в этом регистре. Функции '__builtin_frame_address (0)' и '__builtin_return_address (0)' используются для [получения адреса возврата и кадра вызывающей функции] (http://gcc.gnu.org/onlinedocs/gcc/Return-Address.html). Ваша ошибка говорит, что в реестре ссылок не указан обратный адрес или структура 'backtrace_frame_t' не соответствует вашему стеку. – jschmier

1

Взгляните на тот же вопрос, задаваемый здесь:

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

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

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

+0

Вы должны поместить информацию из этого сообщения в свой ответ здесь, иначе, когда эта ссылка 404s, ваш ответ станет бесполезным. –

+0

ОК. сделал ссылку на git commit. – lumpidu

Смежные вопросы