我正在研究传统的VB6应用程序。在某个用例中,应用程序失败,看起来像一个空指针异常:
“0x2982e900”的指示 引用内存为“0x00000156”。该 记忆无法“读”。
我试过做一些源代码调试,但我找不到抛出异常的源代码行。有没有办法找到对应于汇编指令地址的源代码行,如0x2982e900? (我尝试过Reflector,但它似乎只支持.NET)。
更新
当我使用VB6 IDE调试器调试应用程序时,我在VB6源代码中没有任何中断。而是弹出上面提到的Windows错误消息,让我选择启用Visual Studio 2010调试器。如果我这样做,VS2010调试器会显示如下汇编代码:
[...]
2982E8FA push eax
2982E8FB拨打29832E9B
2982E900 mov ax,word ptr [EAX + 156H]
[...]
该应用程序使用来自名为Infragistics的公司的一些.ocx文件来实现GUI。根据{{3}}实用程序,显示的汇编代码来自文件IGTOOLBARS40.OCX
。
答案 0 :(得分:3)
与托管的.Net代码一样,VB6代码无法遇到无效的指针异常(因为VB6不包含指针)。
问题很可能是由
引起的Declare
语句,有时通过类型库(hard-core!)。第一步是确定哪一行VB6代码触发了崩溃。
或者:
或者将0x2982e900
地址解码为带有CrashFinder的VB6源代码行号。您始终使用包含PDB file的debug symbols构建您的EXE,对吗?
要告诉VB6 IDE使用调试信息构建项目,您需要更改其中一个默认编译选项。从“文件”菜单中,选择“Build Project1.exe”。单击出现的保存文件对话框中的“选项”按钮,将打开属性表。切换到“编译”选项卡,并选中标记为“创建符号调试信息”的框。
答案 1 :(得分:1)
您可以尝试使用IDA Pro等反汇编程序对应用程序进行逆向工程。