Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: проблема с пошаговой отладкой в windbg  (Прочитано 8762 раз)
0 Пользователей и 1 Гость смотрят эту тему.
westley
Гость
« : 09-09-2004 07:44 » 

собственно, сабж - решил я посмотреть логику работы известного примера filespy из ddk, получил отладочные символы драйвера - filespy.sys - filespy.pdb, загрузил их, загрузил символы с сайта мелкософта, вернее настроил загрузку через msdl... после проверки через lm того что модуль с символами на самом деле загружен - ставлю курсор в файле filespy.c на,скажем, driverentry, жму f10 - курсор на месте, в окне Command появилось
kd> p
nt!RtlpBreakWithStatusInstruction+0x1:
80456489 c20400           ret     0x4
при этом курсор остался в коде на месте, при следующем нажатии f10:
 kd> p
nt!KeUpdateSystemTime+0x13e:
8046950e ebb4             jmp     nt!KeUpdateSystemTime+0xf4 (804694c4)
kd> p
nt!KeUpdateSystemTime+0xf4:
804694c4 833d18ee468000   cmp     dword ptr [nt!KiTickOffset (8046ee18)],0x0
kd> p
nt!KeUpdateSystemTime+0xfb:
804694cb 7f1f             jg      nt!KeUpdateSystemTime+0x11c (804694ec)

как добиться того чтобы пошагово идти по коду?
Записан
grozny
Гость
« Ответ #1 : 09-09-2004 22:03 » 

Не понял немного - ты и идёшь "пошагово по коду". Именно по коду. Один шаг= одна инструкция ЦП. Если тебе надо шагать не по коду, а по строчкам кода, измени "размер шага".

Мануал перечесляет след. команды и опции kd для ходьбы по сорсам:

Цитата

.lines        enable source line information
...(покусано)
l+t           stepping will be done by source line
l+s           source lines will be displayed at prompt
...(покусано)
pr            execute one source line, and toggle register display off
p             execute one source line


здесь много нажёвано:
http://www.microsoft.com/whdc/devtools/debugging/debugstart.mspx
Записан
westley
Гость
« Ответ #2 : 11-09-2004 17:05 » 

Цитата: grozny
Не понял немного - ты и идёшь "пошагово по коду". Именно по коду. Один шаг= одна инструкция ЦП. Если тебе надо шагать не по коду, а по строчкам кода, измени "размер шага".

Мануал перечесляет след. команды и опции kd для ходьбы по сорсам:

Цитата

.lines        enable source line information
...(покусано)
l+t           stepping will be done by source line
l+s           source lines will be displayed at prompt
...(покусано)
pr            execute one source line, and toggle register display off
p             execute one source line


здесь много нажёвано:
http://www.microsoft.com/whdc/devtools/debugging/debugstart.mspx
использовал вышеприведенные советы - включил .lines -e и опции для .l, далее получилось следующее:
 - если нажимать просто p - в строке имеем то же самое - kd> p
nt!RtlpBreakWithStatusInstruction+0x1:
 - если сначала через ln узнать адрес функции, скажем, driverentry, и запустить p=<адрес DriverEntry> в строке отображается следующая функция на выполнение, теперь если снова нажать p выдается вообще такое:
kd> p

*** Fatal System Error: 0x000000d1
                       (0xF1E405E0,0x0000001C,0x00000000,0xF1E405E0)

Break instruction exception - code 80000003 (first chance)

A fatal system error has occurred.
Debugger entered on first try; Bugcheck callbacks have not been invoked.

A fatal system error has occurred.

так что - надо так? - сначала узнавать адрес следующей ф-ции через ln  и только потом выполнять  p=<адрес DriverEntry>   Не понял  Вот такой я вот  :new_twist:  :new_shot:
Записан
Anonymous
Гость
« Ответ #3 : 12-09-2004 06:29 » 

дык! нельзя вот просто так взять и запустить DriverEntry. Должны быть параметры, странички памяти и пр. А ты взял и передал управление на DriverEntry.

Тебя система должна вызвать. Т.е. в теории, конешно же, ты можешь отановиться в системном отладчике на совершенно произвольном месте и совершив тучу магических пассов руками, отправить процессор по произвольному адресу  :twisted: . И всё отработает как ожидалось, и ничего не сломается.

 А ты всего лишь должен поставить bp. Ну или вкомпилируй жёсткий брэкпойнт (если на С/С++)
_asm int 3;
на асме если пишешь, то так и напиши int 3.

Я так делаю (отмечу, что сорсы и компиляция делается на хост-машине, запускается драйвер на таргет-машине, свзяан таргет с хостом через 1394, а отладчик не kd, а windbg, что практически одно и то же):
- компилирую драйвер на хосте,
- засовываю символы в символьный сервер
- инсталлирую драйвер на таргет-системе,
- вываливаюсь в отладчик на хосте (я пользую windbg, так что жму ctrl-break)
- получаю символы в отладчике на хост-системе. Путём либо !lm <driver_name> /reload, либо через автоматическую привязку хост-таргет (см. .kdfiles)
- верифицирую смиволы:
winbdg>lm m<driver_name>
должна напечатать имя пдб, таймстамп и что символы есть
- ставлю bp <имя_символа> . Если возможна неоднозначность, то надо писать driver_name!<имя_символа>
- ну и по приходу на брэкпойнт первый раз отладчик может попросить показать на сорсы (если сразу сам не найдёт) - именно поэтому сорсы луче держать на хосте.
- после чего windbg ходит в ассемблерном окне по командам проца, а в сорсовом окне(окнах) - по строке сорса.
Записан
grozny
Гость
« Ответ #4 : 12-09-2004 06:32 » 

ну вот, опять забыл войти - пред. пост - мой Отлично
Записан
westley
Гость
« Ответ #5 : 12-09-2004 13:50 » new

спасибо! все получилось!!! Отлично  Ага  Показываю язык  8)
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines