如何修复VB6 APPCRASH ntdll.dll错误

时间:2018-12-05 16:33:53

标签: vb6 windows-xp windows-7-x64

我正在从现有的VB6项目中制作一个exe。在制作过程中,VB崩溃并显示以下消息

NA_real_

异常代码:Visual Basic has stopped working Problem Event Name: APPCRASH Application Name: vb6.exe Application Version: 6.0.97.82 Fault Module Name: ntdll.dll

我可以从VB6运行项目而没有任何麻烦。当我尝试制作exe时出现问题。

请让我知道可能出什么问题了吗?

谢谢!

1 个答案:

答案 0 :(得分: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

然后

在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中,而不是单独的文件中。确保您使用 No Optimisations 编译程序,然后在 Create Symbolic Debug Info 复选框中打勾。两者都在项目属性的“编译”选项卡上。

来自最近的符号搜索的

样本输出。

  

加载转储文件[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个参数。您会发现调试器启动了其他线程,因此我们需要找到程序的线程。

~

列出所有线程

~<threadid> e <command>

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

  

0:004> 〜0 e kb

     

ChildEBP RetAddr Args指向子项04bdfc30

     

75ae325a 04bdfc70 00000000 00000000 USER32!NtUserGetMessage + 0xc

     

04bdfc4c 00895eb6 04bdfc70 00000000 00000000 USER32!GetMessageW + 0x2a

     

04bdfc8c 008a5b41 00890000 00000000 04e2336f记事本!WinMain + 0xe6

     

04bdfd20 74ad3744 7f229000 74ad3720 10fde46e

     

notepad!WinMainCRTStartup + 0x151 04bdfd34 7755a064 7f229000 b0c1107f

     

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

     

7757d7c9 00000000 ntdll!__ RtlUserThreadStart + 0x2f 04bdfd8c 00000000

     

008a59f0 7f229000 00000000 ntdll!_RtlUserThreadStart + 0x1b

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

ds 775a1300

或查看值

db 775a1300