Visual C ++ 2005 Professional 调试/ Win32的 Windows 7企业版64位
我在程序的入口点设置了一个断点。我的程序在到达该断点之前崩溃了。当发生未处理的异常(访问冲突读取位置0x00000000。)时,我单击Break,并设置当前指令指针所在的断点。重新启动调试会话,程序在新断点处停止。我向上滚动到当前函数的顶部__tmainCRTStartup(),并在函数的左大括号处设置断点。
我再次停止/重启调试器,这次停在__tmainCRTStartup()。到目前为止,所有的DLL都已加载,如果需要,则运行其加载功能。按[F5]运行到原始断点。 Next Statement指针指向对WinMain(...)的调用。
单步执行此语句会导致未处理的异常。单步进入语句就会引发我的声明:“返回AfxWinMain(hInstance,hPrevInstance,lpCmdLine,nCmdShow);”。再次进入反汇编窗口,我将看到下一个要运行的语句:“jmp AfxWinMain(563AFAh)”。
我可以单步执行汇编代码,但是在尝试取消引用其中一个寄存器中的指针之前,我无法弄清楚它正在尝试做什么,该寄存器的值为零(0)。
我读到另一篇关于C程序在到达main()之前崩溃的帖子。即使标记为“C”,许多响应者也提到了类的静态实例的构造函数可能是罪魁祸首。其他人提到DLL的加载和运行他们自己的启动代码可能会使程序崩溃,但DLL似乎都加载了,并且我有证据表明在程序到达__tmainCRTSetup()之前至少有一个DLL运行其启动代码。
任何人都可以帮我理解这个吗?知道它为什么这样做应该有助于我理解如何修复它。
谢谢!