Я делаю exe из существующего проекта VB6. Во время Make VB вылетает со следующим сообщением
Visual Basic перестал работать Имя события проблемы: APPCRASHA Имя приложения: vb6.exe Версия приложения: 6.0.97.82 Имя модуля ошибки: ntdll.dll
Код исключения: c0000005
Я могу без проблем запустить проект из VB6. Проблема возникает, когда я пытаюсь сделать exe.
Не могли бы вы сообщить мне, что может быть не так?
Спасибо!
Все это нужно сделать на компьютере, на котором произошла ошибка. Я не могу загрузить свой 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 как аварийный дамп .
Он покажет адрес загрузки.
Введите WinDbg
ln + 7c911780
Это даст вам ближайший к аварии символ. Вероятно, это бесполезно, но давайте посмотрим.
Вы также можете запустить VB6 под WinDbg (убедитесь, что WinDbg запускается от имени администратора). При сбое выполните трассировку стека.
Также выполните ! Analyze
при сбое. Он предназначен для синих экранов, но даст информацию о сбое приложения.
Введите в командной строке WinDbg
! Анализируйте -v
-v
означает Verbose, и если сбой был вызван программой, а не оборудованием или драйвером, он появится в середине списка. .
например
PROCESS_NAME: java.exeIMAGE_NAME: ntkrnlmp.exe
PROCESS_NAME появляется только в analysis - v
и только если программа инициировала вызов, который вызвал ошибку.
Команды WinDbg
Открыть как Исполняемый .
windbg -o -g -G c: windows system32 cmd.exe/k batfile.bat
Вы можно нажать F12
, чтобы остановить его, и kb
покажет стек вызовов ( g
продолжает программу). Если есть ошибки, он также остановится и покажет их.
После загрузки есть точка останова, но до запуска любого кода. Чтобы продолжить, нажмите g
. Точно так же есть точка останова после выполнения всего кода, но до его выгрузки..
Введите lm
для вывода списка загруженных модулей, x *! *
для вывода списка символов и bp имя символа
для установки точки останова
При программировании на 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 nz na pe 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! RtlInitializeBitMap + 0x14 | (4b2e5540)
ntdll! TpCallbackUnloadDllOnCompletion
Пример трассировка стека.
Вы следите, какая функция какие функции вызывала. Итак, вы читаете это снизу вверх. У него есть первые 4 параметра, которые были переданы функции. Вы обнаружите, что отладчик запускает дополнительные потоки, поэтому нам нужно найти поток нашей программы.
~
Перечисляет все потоки
~ e
Делайте KB для всех потоков, пока не найдете основной.
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
04bdf00000000000000000000008 04e2336f блокнот! WinMain + 0xe6
04bdfd20 74ad3744 7f229000 74ad3720 10fde46e
блокнот! WinMainCRTStartup + 0x151 04bdfd34 7755a064 7f229000 b0c1107f! Базовый поток # p> Предположим, что 04bdfc70 — это HWnd. Причина в том, что об этом говорится в документации. Но предположим, что это адрес строки. Это показывает, что там.
ds 775a1300
или для просмотра значений
db 775a1300
Все это нужно делать на компьютере с неисправностью. Я не могу загрузить свой 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 как аварийный дамп .
Он покажет адрес загрузки.
Введите WinDbg
ln + 7c911780
Это даст вам ближайший к аварии символ. Вероятно, это бесполезно, но давайте посмотрим.
Вы также можете запустить VB6 под WinDbg (убедитесь, что WinDbg запускается от имени администратора). При сбое выполните трассировку стека.
Также выполните ! Analyze
при сбое. Он предназначен для синих экранов, но даст информацию о сбое приложения.
Введите в командной строке WinDbg
! Анализируйте -v
-v
означает Verbose, и если сбой был вызван программой, а не оборудованием или драйвером, он появится в середине списка. .
например
PROCESS_NAME: java.exeIMAGE_NAME: ntkrnlmp.exe
PROCESS_NAME появляется только в analysis - v
и только если программа инициировала вызов, который вызвал ошибку.
Команды WinDbg
Открыть как Исполняемый .
windbg -o -g -G c: windows system32 cmd.exe/k batfile.bat
Вы можно нажать F12
, чтобы остановить его, и kb
покажет стек вызовов ( g
продолжает программу). Если есть ошибки, он также остановится и покажет их.
После загрузки есть точка останова, но до запуска любого кода. Чтобы продолжить, нажмите g
. Точно так же есть точка останова после выполнения всего кода, но до его выгрузки..
Введите lm
для вывода списка загруженных модулей, x *! *
для вывода списка символов и bp имя символа
для установки точки останова
При программировании на 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 nz na pe 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! RtlInitializeBitMap + 0x14 | (4b2e5540)
ntdll! TpCallbackUnloadDllOnCompletion
Пример трассировка стека.
Вы следите, какая функция какие функции вызывала. Итак, вы читаете это снизу вверх. У него есть первые 4 параметра, которые были переданы функции. Вы обнаружите, что отладчик запускает дополнительные потоки, поэтому нам нужно найти поток нашей программы.
~
Перечисляет все потоки
~ e
Делайте KB для всех потоков, пока не найдете основной.
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
04bdf00000000000000000000008 04e2336f блокнот! WinMain + 0xe6
04bdfd20 74ad3744 7f229000 74ad3720 10fde46e
блокнот! WinMainCRTStartup + 0x151 04bdfd34 7755a064 7f229000 b0c1107f! Базовый поток # p> Предположим, что 04bdfc70 — это HWnd. Причина в том, что об этом говорится в документации. Но предположим, что это адрес строки. Это отображает, что там есть.
ds 775a1300
или для просмотра значений
db 775a1300