Как исправить ошибку VB6 APPCRASH ntdll.dll на make

Я делаю exe из существующего проекта VB6. Во время Make VB вылетает со следующим сообщением

  Visual Basic перестал работать Имя события проблемы: APPCRASHA Имя приложения: vb6.exe Версия приложения: 6.0.97.82 Имя модуля ошибки: ntdll.dll  

Код исключения: c0000005

Я могу без проблем запустить проект из VB6. Проблема возникает, когда я пытаюсь сделать exe.

Не могли бы вы сообщить мне, что может быть не так?

Спасибо!


0

Все это нужно сделать на компьютере, на котором произошла ошибка. Я не могу загрузить свой 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  
Поделиться
Улучшите этот ответ

отредактировал 20 июня ’20 в 9:12
Сообщество ♦
111 серебра значок
ответил 06 дек. ’18 в 22:18
добавить комментарий |

Все это нужно делать на компьютере с неисправностью. Я не могу загрузить свой 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  

Оцените статью
Botgadget.ru
Добавить комментарий