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