Отладка приложений



              

Журнал программы Dr. Watson для Windows 2000 - часть 5


Например, пусть первая команда, дизассемблированная в дампе состояния потока, использовала (в качестве аргумента) ссылку на ячейку памяти из регистра ЕВХ. Если сбой дала команда, расположенная на 10 инструкций позже, то одна из промежуточных команд может легко изменить содержимое ЕВХ. Однако когда Dr. Watson выполняет дизассемблирование, то для эффективного преобразования адреса он использует текущее значение ЕВХ (т. е. то, которое этот регистр содержал во время сбоя). По этой причине эффективный адрес, показанный в коде дизассемблера дампа состояния потока, может быть неправильным. Для того чтобы убедиться, что в дампах журнала отображены корректные адреса, тщательно проверьте, не могли ли какие-нибудь команды, предшествующие сбою, изменить значения регистров.

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

Ox0040BD2D MOV ECX,[ЕАХ+Ох4]

пыталась получить доступ к ПУСТОМУ (NULL) указателю в ЕАХ (ЕАХ=00000000). Посмотрев внимательно на команду в предшествующей строке:

MOV ЕАХ, [ЕВР+ОхС],

можно предположить, что с положительным смещением от ЕВР, вероятно, расположена адресная ссылка на параметр функции. Величина смещения (ОхС) означает, что команда сослалась на второй параметр функции. Первой гипотезой при отладке этого сбоя должна быть такая: выполнение функции завершилось неудачей, потому что ей был передан неправильный второй параметр (все это показывает, как важно хорошо знать язык ассемблера для чтения журналов программы Dr. Watson!).

Ниже показана вторая часть дампа состояния потока, которая названа stack Back Trace (обратная трассировка стека) (). Заметьте, что длинные значения столбца Function Name (и только они) там, где они не поместились в строке, перенесены на следующую строку.

*——> Stack Back Trace <——*

FramePtr ReturnAd Paramtl Param#2 Param#3 Param#4 Function Name

0012FBC4 0040BCB5 0000033C 00000000 80000003 008C67CO

!CWDBGProj Doc::HandleBreakpoint 

0012FBEO 00405A9C 0000033C 010DFCOC 008C68BO 0012FCF4

!CWDBGProj Doc::HandleExceptionEvent 




Содержание  Назад  Вперед