我正在从现有的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时出现问题。
请让我知道可能出什么问题了吗?
谢谢!
答案 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