Как исправить ошибку VB6 APPCRASH ntdll.dll на make - PullRequest
0 голосов
/ 05 декабря 2018

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

Visual Basic has stopped working

Problem Event Name: APPCRASH
Application Name: vb6.exe
Application Version: 6.0.97.82
Fault Module Name: ntdll.dll

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

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

Пожалуйста, не могли бы вы дать мне знать, что может быть не так?

Спасибо!

1 Ответ

0 голосов
/ 07 декабря 2018

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