Linux (MIPS): временно «изменить» содержимое реестра при просмотре дампа ядра - PullRequest
3 голосов
/ 30 сентября 2011

Некоторые потоки в моем приложении заполнены оптимизированными функциями, и когда я отлаживаю приложение, gdb не может отследить эти функции. Но я посмотрел на ассемблер и могу частично размотать стек вручную до кадра предыдущей функции, выполнив что-то вроде:

set $old_ra = $ra
set $old_sp = $sp
set $ra = *(unsigned long*)($sp+28)
set $sp = $sp + 48
bt
set $ra = $old_ra
set $sp = $old_sp

Это отлично работает, если я выполняю отладку в режиме реального времени, и успешно показывает полную обратную трассировку. Я хочу быть в состоянии сделать то же самое в автономном режиме, глядя на дамп ядра. Понятно, что концепция выковывать регистр не имеет смысла в дампе ядра, но есть ли способ сказать gdb «просто использовать это значение для регистра», чтобы я мог сделать аналогичный возврат?

1 Ответ

2 голосов
/ 01 декабря 2011

Не из коробки. Единственный способ, который я нашел, - это физически изменить файл ядра. Основной файл ELF обычно содержит один или несколько разделов 'reg', которые содержат регистры процесса. Все, что вам нужно, это выяснить, где именно в этом разделе находится регистр, который вы хотите изменить, а затем отредактировать файл, поместить туда новое значение и повторно запустить GDB.

...