Все это нужно сделать на компьютере с ошибкой.Я не могу загрузить ntdll.dll
, так как это другая версия, и адреса будут отличаться от ваших.
Скачать и установить средства отладки для Windows
http://msdn.microsoft.com/en-us/windows/hardware/hh852363
УстановитьWindows SDK, но просто выберите инструменты отладки.
Создайте папку с именем Symbols
в C:\
Это позволяет WinDbg получить символы для вашей версии ntdll.dll.Запустите Windbg. Файл меню - Путь к символу и введите
srv*C:\symbols*http://msdl.microsoft.com/download/symbols
, затем
Откройте ntdll в WinDbg как crashdump .
Появится адрес загрузки.
Введите WinDbg
ln <modloadaddress> + 7c911780
Это даст вам ближайший символ сбоя.Это, вероятно, бесполезно, но давайте посмотрим.
Вы также можете запустить VB6 под WinDbg (убедитесь, что WinDbg запущен от имени администратора).При сбое выполните трассировку стека.
Также выполните !Analyze
при сбое.Он предназначен для синих экранов, но даст информацию о appcrash.
Введите в командной строке WinDbg
!analyze -v
-v
означает Verbose, и если сбой был вызван программой,в отличие от оборудования или драйвера, он будет отображаться в середине списка.
например,
PROCESS_NAME: java.exe IMAGE_NAME: ntkrnlmp.exe
PROCESS_NAME отображается тольков выводе analyze -v
и только в том случае, если программа инициировала ошибочный вызов.
Команды WinDbg
Открыть как Исполняемый файл .
windbg -o -g -G c: \ windows \ system32 \ cmd.exe / k batfile.bat
Вы можете нажать F12
, чтобы остановить его, и kb
покажет стек вызовов (g
продолжает программу).Если есть ошибки, они также остановятся и покажут их.
После загрузки существует точка останова, но до запуска любого кода.Нажмите g
, чтобы продолжить.Аналогично, существует точка останова после того, как весь код запущен, но до его выгрузки.
Введите lm
, чтобы вывести список загруженных модулей, x *!*
, чтобы вывести список символов, и bp symbolname
, чтобы установить точку останова
При программировании на VB6 эта переменная окружения link=/pdb:none
хранит символы в dll, а не в отдельных файлах.Убедитесь, что вы скомпилировали программу с Без оптимизаций и отметили галочкой Создать символическую отладочную информацию .Оба на вкладке «Компиляция» в свойствах проекта.
Пример вывода из поиска ближайшего символа.
Загрузка файла дампа [C: \ Windows \ System32 \ntdll.dll] Путь поиска символов
: srv c: \ symbols http://msdl.microsoft.com/download/symbols
Путь поиска исполняемого файла: ModLoad: 4b280000 4b3f9000
C: \ Windows \ System32 \ ntdll.dll eax = 00000000 ebx = 00000000 ecx = 00000000
edx = 00000000 esi = 00000000 edi = 00000000 eip = 4b280000 esp = 00000000
ebp = 00000000 iopl = 0 nv up di pl na n nc cs = 0000 ss = 0000
ds = 0000 es = 0000 fs = 0000 gs = 0000 efl = 00000000
ntdll! __ guard_fids_table (ntdll + 0x0): 4b280000 4d
dec ebp 0: 000> ln 4b280000 + 65534 (4b2e5520)
ntdll! RtlInitializeB14Map + 0(4b2e5540)
ntdll! TpCallbackUnloadDllOnCompletion
Пример трассировка стека.
Вы выполняете какую функциюназывается какие функции.Таким образом, вы читаете это снизу вверх.У него есть первые 4 параметра, которые были переданы функции.Вы обнаруживаете, что отладчик запускает дополнительные потоки, поэтому нам нужно найти один из наших программ.
~
Перечисляет все потоки
~<threadid> e <command>
Делайте КБ во всех потоках, пока не найдете основной.
0: 004> ~ 0 e kb
ChildEBP RetAddr Args to Child 04bdfc30
75ae325a 04bdfc70 00000000 00000000 USER32! NtUserGetMessage + 0xc
04bdfc4c 00895eb6 04bdfc70 00000000 00000000 USER32! GetMessageW + 0x2a
1147 * 04bdfc8c 008a5b41 00890000 00000000 04e2336f блокнота! WinMain + 0xE6
1149 * 04bdfd20 74ad3744 7f229000 74ad3720 10fde46e
1151 * блокнота! WinMainCRTStartup + 0x151 04bdfd34 7755a064 7f229000 b0c1107f
00000000 KERNEL32! BaseThreadInitThunk + 0x24 04bdfd7c 7755a02f FFFFFFFF
1155 * 7757d7c9 00000000 Ntdll! __ RtlUserThreadStart + 0x2f 04bdfd8c 00000000
008a59f0 7f229000 00000000ntdll! _RtlUserThreadStart + 0x1b
Предположим, что 04bdfc70 является HWnd.Который это - потому что документация говорит так.Но предположим, что это адрес строки.Это показывает, что там.
ds 775a1300
или посмотреть на значения
db 775a1300