2014-09-26 3 views
0

У меня очень старая программа, которая разбилась. При отладке аварии с Windbg, что я установил в качестве посмертного отладчик, я заметил, что один из регистров был установлен в странное значение:Странные значения в регистрах и параметрах вызова

rdx=00000000deadface

Stack след резьбы что вызвало сбой (нарушение прав доступа) содержит подозрительное значение, а также:

objc_1!objc_msg_lookup+0x29: 00000000 6784a4c5 488b4a38 mov rcx,qword ptr [rdx+38h] ds:00000000deadfb06=????????????????

Я получил первое значение из списков регистров, которое было включено в вывод команды !analyze -v. Вторая команда была создана командой для перечисления стека нисходящей нити (~9k).

Является ли Windbg попыткой сказать мне что-то, поместив такие значения в реестр и дампы стека, или я просто жертва какого-то старого тестового кода или мистификации (или это просто совпадение)?

Программа написана в obj-c и запускает старые версии GNUstep и obj-c runtime.

+1

Существует шаблон памяти 'deadbeef', который обозначает память, освобожденную' HeapFree() ' –

+0

Спасибо, хороший намек. Просто обнаружил, что 'deadface' - это шаблон, используемый GNUstep для аналогичной цели. –

ответ

2

Оказалось, что способ GNUstep сказать, что программа пыталась отправить сообщение (= вызов метода) на объект, который уже был освобожден.

Если объект освобожден, GNUstep устанавливает 0xdeadface в качестве значения указателя isa объекта. isa указатель ссылается на класс, объектом которого является экземпляр; Object-c runtime использует этот указатель для разрешения методов объекта при отправке сообщений на него.

Следовательно, при каждой попытке отправить сообщение освобожденному объекту возникает segfault, который, если он попадает в отладчик, обычно показывает 0xdeadface в регистре или в стеке.