ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
19 апреля
652188 Топик полностью
fk0, легенда (11.02.2016 13:02, просмотров: 277) ответил mr-x на Займусь сейчас, но это будет тот ещё детектив. Может ещё какие соображения найдутся? С какой стороны подойти и в какую сторону посмотреть?
PIC32? Ты попал! На всех практически архитектурах есть понятие frame pointer. И зная его значение и PC можно размотать легко стек, найти адреса возврата. Даже на pic24. Но не на MIPS... Там две засады: 1) в качестве FP может использоваться какой попало регистр, часто используют SP (отдельного FP нет) -- следовательно, настоящий FP не сохраняется где-то в стеке и чтоб вернуться на уровень выше нужно знать сколько в стеке занимает текущая функция, 2) адрес возврата в регистре RA обычно, но не обязательно... а может быть тоже где попало (и может сохраняться, а может не сохраняться в очередном фрейме стека). Из-за такой чрезмерной гибкости в ABI размотать стек без наличия отладочной информации -- практически не реально... Но есть два подхода: 1) эвристический: берём и просматриваем стек вверх, каждое слово. Если оно похоже на адрес в программной памяти -- считаем адресом возврата... можно ещё проверки делать -- просматривать что по этому адресу лежит (инструкция JR $31) и делать выводы. 2) с опорой на секцию ".pdr" (которая по-умолчанию NOLOAD и в памяти отсутствует) -- это MIPS-специфическая секция, где хранятся параметры кадра стека для каждой функции. С её использованием можно размотать стек назад восстанавливая значения всех регистров в каждом фрейме. Если, конечно, на стеке что-то не попортилось. 3) с опорой на секцию .debug_info и т.п. из DWARF -- как это делать gdb. По пункту 3 -- нужно просто использовать gdb, если есть. По пункту 2 -- он сложный и требует таскать с собой в рантайме 5-20% от объёма программной памяти дополнительно. И вряд ли нужен при падениях (он нужен в случаях, когда backtrace нужно получить _быстро_, ибо п.1. сильно тормозной). Пункт 1 твой выбор. Выпечатываешь адреса, потом с помощью addr2line (скрипт напиши для автоматизации) трансформируешь в имена файлов и номер строки. Потом редактором каждую смотришь (найди редактор, чтоб по клику мышкой на файл и строку записанную в тексте переходил) и отсеиваешь явно некорректные варианты (их будет ~половина). И будет тебе что-то вроде бэктрейса. Ещё для последнего (где упала программа) фрейма нужно распечатать все регистры и, бывает полезно, последние ~сотню байт стека.
[ZX]