Поиск
Показаны результаты для тегов 'раскрутка стека'.
-
Задача по обратной раскрутке стека вызовов у меня возникает регулярно. Понятно, что в режиме отладки за вас это делает отладчик, но часто нужно делать пост-анализ сбоев в рантайме. Ничего готового я не нашел, хотя возможно все лежит на поверхности. Сейчас я реализовал это через одно место (жутко процессоро- и компиляторо- зависисимо - IAR и Thumb-2). void assertSave ( void) { uint32_t sp; uint16_t * pc; uint32_t report[8]; uint32_t count; __ASM volatile ("mov %0, sp" : "=r" (sp) ); __ASM volatile ("mov %0, pc" : "=r" (pc) ); memset(report, 0, sizeof(report)); for (uint32_t i = 0; i < 8; i++) { while (1) { // check pc if (((uint32_t)pc < IFLASH_START_ADDRESS) || ((uint32_t)pc > IFLASH_END_ADDRESS)) break; // check sp if (((uint32_t)sp < IRAM_START_ADDRESS) || ((uint32_t)sp > IRAM_END_ADDRESS)) break; // find POP or POP.W if (((*pc & 0xFF00) == 0xBD00) || (*pc == 0xE8BD)) { // count = number of registers to be restored by POP command if (*pc == 0xE8BD) { count = (uint32_t)(*(pc + 1) & 0x1FFF); } else { count = (uint32_t)(*pc & 0x00FF); } count = count - ((count >> 1) & 0x55555555); count = (count & 0x33333333) + ((count >> 2) & 0x33333333); count = (((count + (count >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24; // checking previous command is ADD SP,SP,XX if ((*(pc - 1) & 0xFF00) == 0xB000) { // count += size of the stack correction before POP count += (uint8_t)(*(pc - 1) & 0x00FF); } // getting stack frame of previous function sp += count << 2; // getting continue address of previous function pc = (uint16_t *)(*(uint32_t *)sp & 0xFFFFFFFE); sp += 4; // save address of CALLSTACK report[i] = (uint32_t)pc - 4; break; } pc += 1; } } // write to blackbox blackBoxWrite(report, sizeof(report)); } По сути я просматриваю от текущего PC до ближайшего возврата через POP или POP.W. По коррекции стека перед выходом определяю размер текущего фрейма стека с предположением что первым в стек компилятор кладет адрес возврата. Ну и дальше рекурсия. Возможно у кого-то есть более грамотное решение.
- 21 ответ
-
- раскрутка стека
- отладка
-
(и ещё 1 )
C тегом: