如何修复VB6 APPCRASH ntdll.dll错误



>我正在从现有的 VB6 项目制作一个 exe。在制作过程中,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 时出现问题。

请您告诉我可能出了什么问题吗?

谢谢!

这一切都需要在有故障的计算机上完成。我无法加载我的ntdll.dll,因为它是不同的版本,并且地址将与您的地址不同。

下载并安装适用于 Windows 的调试工具

http://msdn.microsoft.com/en-us/windows/hardware/hh852363

安装 Windows SDK,但只需选择调试工具。

C:中创建一个名为Symbols的文件夹

这允许 WinDbg 获取 ntdll.dll 版本的符号。启动风。文件菜单 -符号文件路径并输入

srv*C:symbols*http://msdl.microsoft.com/download/symbols

然后

在 WinDbg 中打开 ntdll 作为故障转储

它将显示加载地址。

键入 WinDbg

ln <modloadaddress> + 7c911780 

这将为您提供最接近崩溃的符号。它可能没有用,但让我们看看。


您也可以在WinDbg下运行VB6(确保WinDbg以管理员身份运行)。崩溃时,执行堆栈跟踪。

崩溃时也要做一个!Analyze。它适用于蓝屏,但会提供有关应用程序崩溃的信息。

在 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\System32tdll.dll] 符号搜索路径

is: srvc:\symbolhttp://msdl.microsoft.com/download/symbols

可执行搜索路径为:ModLoad: 4b280000 4b3f9000

C:\Windows\System32tdll.dll eax=00000000 ebx=00000000 ecx=00000000

edx=00000000 esi=00000000 edi=00000000eip=4b280000 esp=

00000000EBP=00000000 IOPL=0 nv up di pl nz na pe nc cs=0000 ss=0000

DS=0000 ES=0000 FS=0000 GS=0000EFL=

00000000NTDLL!__guard_fids_table (NTDLL+0x0): 4B280000 4D

12 月 EBP 0:000>LN 4B280000 + 65534 (4B2E5520)

新人!RtlInitializeBitMap+0x14 | (4b2e5540)

新人!TpCallbackUnloadDllOnCompletion(英语:TpCallbackUnloadDllOnCompletion)

示例堆栈跟踪。

你遵循什么函数叫什么函数。所以你从下往上读它。它具有传递给函数的前 4 个参数。你发现调试器启动了额外的线程,所以我们需要找到程序的一个。

~

列出所有线程

~<threadid> e <command>

在所有线程上执行 KB,直到找到主线程。

0:004>~0 e KB

ChildEBP RetAddr Args to Child 04bdfc30

75AE325A 04BDFC70 00000000 00000000 USER32!NtUserGetMessage+0xc

04bdfc4c 00895eb604bdfc7000000000 00000000 USER32!获取消息W+0x2a

04BDFC8C 008A5B41 00890000 00000000 04E2336F 记事本!赢主+0xe6

04BDFD20 74AD3744 7F229000 74AD3720 10FDE46E

记事本!WinMainCRTStartup+0x151 04bdfd34 7755a064 7f229000 b0c1107f

00000000 KERNEL32!BaseThreadInitThunk+0x24 04bdfd7c 7755a02f fffffffff

7757d7c9 00000000 NTDLL!__RtlUserThreadStart+0x2f 04BDFD8c 00000000

008a59f0 7f229000 00000000 ntdll!_RtlUserThreadStart+0x1b

假设04bdfc70是 HWnd。这是因为文档是这样说的。但假设它是一个字符串的地址。这将显示那里的内容。

ds 775a1300

或查看值

db 775a1300

最新更新