Джон Роббинс - Отладка приложений для Microsoft .NET и Microsoft Windows
Название: | Отладка приложений для Microsoft .NET и Microsoft Windows | |
Автор: | Джон Роббинс | |
Жанр: | Современные российские издания, Литература ХXI века (эпоха Глобализации экономики), Windows, Отладка, тестирование и оптимизация ПО, .NET Framework, Windows API | |
Изадано в серии: | неизвестно | |
Издательство: | Русская Редакция | |
Год издания: | 2004 | |
ISBN: | 978–5–7502–0243—0 | |
Отзывы: | Комментировать | |
Рейтинг: | ||
Поделись книгой с друзьями! Помощь сайту: донат на оплату сервера |
Краткое содержание книги "Отладка приложений для Microsoft .NET и Microsoft Windows"
Аннотация к этой книге отсутствует.
Читаем онлайн "Отладка приложений для Microsoft .NET и Microsoft Windows". [Страница - 259]
EBX — то, которое имело место в момент ошибки. Поэтому эффективный
адрес, показанный в дизассемблированном коде, может быть неверным. Итак,
прежде чем поверить в значения эффективных адресов, убедитесь, что нужные
регистры не были изменены никакой командой.
Благодаря недавно приобретенным навыкам работы с ассемблером, вы долж
ны легко узнать, почему этот поток потерпел крах. Читая ассемблерный листинг
Dr. Watson (или отладчика), большинство программистов допускает серьезную
ошибку: они изучают его сверху вниз. Настоящая хитрость в том, чтобы начать
исследование с места ошибки и постепенно подниматься вверх в поисках коман
ды, присвоившей значения регистрам, использованным в команде, вызвавшей
ошибку.
В нашем случае поток потерпел крах на команде 00410144 MOV ECX, [EAX+0x4], при
которой регистр EAX имел значение 0. В Microsoft Windows все адреса, располо
женные ниже 64 кб, отмечены как не имеющие доступа, поэтому попытка чтения
памяти по адресу 0x00000004 — не лучшая идея. Итак, мы должны найти коман
ду, заносящую 0 в EAX. Поднявшись на одну строку, вы увидите команду MOV EAX,
[EBP+0xC]. Помните, что второй операнд, источник, помещается в первый операнд,
приемник (иначе говоря, помните про правило «от источника к приемнику»). Это
значит, что в EAX было скопировано значение, находившееся по адресу [EBP+0xC].
Следовательно, по адресу [EBP+0xC] располагался 0.
В этот момент вы должны вспомнить еще одну хитрость, которую я описал в
главе 7: «параметры располагаются по положительным смещениям»! Параметры
располагаются по положительным смещениям от регистра EBP, причем первый
находится по адресу [EBP+0x8], а каждый следующий отстоит от предыдущего на
4 байта. Так как 0xC на 4 байта больше, чем 0x8, я могу предположить, что ошиб
ка была вызвана тем, что второй параметр этой функции был равен NULL (наде
юсь, прочитав эти два абзаца, вы поняли, как важно знать ассемблер в достаточ
ном объеме для чтения журналов Dr. Watson!).
692
ЧАСТЬ V
Приложения
Ниже вы можете увидеть вторую часть состояния потока: раздел Stack Back Trace
(обратная трассировка стека) Заметьте: я вывожу имена функций на двух строках,
чтобы они помещались на странице. При помощи двух символов подчеркивания
(__) Dr. Watson отображает операцию разрешения области видимости (::).
*——> Stack Back Trace (Обратная трассировка стека) Обратная трассировка стека Копия необработанного стека --">
адрес, показанный в дизассемблированном коде, может быть неверным. Итак,
прежде чем поверить в значения эффективных адресов, убедитесь, что нужные
регистры не были изменены никакой командой.
Благодаря недавно приобретенным навыкам работы с ассемблером, вы долж
ны легко узнать, почему этот поток потерпел крах. Читая ассемблерный листинг
Dr. Watson (или отладчика), большинство программистов допускает серьезную
ошибку: они изучают его сверху вниз. Настоящая хитрость в том, чтобы начать
исследование с места ошибки и постепенно подниматься вверх в поисках коман
ды, присвоившей значения регистрам, использованным в команде, вызвавшей
ошибку.
В нашем случае поток потерпел крах на команде 00410144 MOV ECX, [EAX+0x4], при
которой регистр EAX имел значение 0. В Microsoft Windows все адреса, располо
женные ниже 64 кб, отмечены как не имеющие доступа, поэтому попытка чтения
памяти по адресу 0x00000004 — не лучшая идея. Итак, мы должны найти коман
ду, заносящую 0 в EAX. Поднявшись на одну строку, вы увидите команду MOV EAX,
[EBP+0xC]. Помните, что второй операнд, источник, помещается в первый операнд,
приемник (иначе говоря, помните про правило «от источника к приемнику»). Это
значит, что в EAX было скопировано значение, находившееся по адресу [EBP+0xC].
Следовательно, по адресу [EBP+0xC] располагался 0.
В этот момент вы должны вспомнить еще одну хитрость, которую я описал в
главе 7: «параметры располагаются по положительным смещениям»! Параметры
располагаются по положительным смещениям от регистра EBP, причем первый
находится по адресу [EBP+0x8], а каждый следующий отстоит от предыдущего на
4 байта. Так как 0xC на 4 байта больше, чем 0x8, я могу предположить, что ошиб
ка была вызвана тем, что второй параметр этой функции был равен NULL (наде
юсь, прочитав эти два абзаца, вы поняли, как важно знать ассемблер в достаточ
ном объеме для чтения журналов Dr. Watson!).
692
ЧАСТЬ V
Приложения
Ниже вы можете увидеть вторую часть состояния потока: раздел Stack Back Trace
(обратная трассировка стека) Заметьте: я вывожу имена функций на двух строках,
чтобы они помещались на странице. При помощи двух символов подчеркивания
(__) Dr. Watson отображает операцию разрешения области видимости (::).
*——> Stack Back Trace (Обратная трассировка стека) Обратная трассировка стека Копия необработанного стека --">
Книги схожие с «Отладка приложений для Microsoft .NET и Microsoft Windows» по жанру, серии, автору или названию:
Журнал «Вязание для взрослых» - Вязание для взрослых 2012 №10 Жанр: Современные российские издания Год издания: 2012 |
Светлана Безфамильная - Справочник для потеряшки (СИ) Жанр: Любовная фантастика Год издания: 2014 |