2009-02-24 49 views
1

我写了一个非常小的64位应用程序,它在干净的Windows Vista x64安装上崩溃。它在安装了Visual Studio 2008的开发计算机(Windows 7 64位)上运行平稳。为什么我的64位C++应用程序崩溃?

64位C++应用程序(非托管)由32位.NET应用程序启动,并在出现访问冲突错误后立即崩溃。这是事件查看器说:

Faulting application MaxTo64.exe, version 0.0.0.0, time stamp 0x49a41d9e, 
faulting module USER32.dll, version 6.0.6001.18000, time stamp 0x4791adc5, 
exception code 0xc0000005, fault offset 0x00000000000236d6, process id 0x82c, 
application start time 0x01c996a346a3e805. 

MaxTo64.exe 
0.0.0.0 
49a41d9e 
USER32.dll 
6.0.6001.18000 
4791adc5 
c0000005 
00000000000236d6 
82c 
01c996a346a3e805 

我已经安装了VC2008可再发行(2008年86,2008年64位,2008 SP1 x86和2008 SP1 64位),所以这不应该成为问题。 编辑:可能值得一提的是,在安装vcredist-package之前,它会以不同的方式崩溃,并且存在并行配置错误。

我是一个C++ n00b,所以我真的不知道在哪里看下。

编辑:Windows调试工具的输出。

CommandLine: "C:\Program Files (x86)\MaxTo\MaxTo64.exe" maxto_a_do_run_run 
Symbol search path is: *** Invalid *** 
**************************************************************************** 
* Symbol loading may be unreliable without a symbol search path.   * 
* Use .symfix to have the debugger choose a symbol path.     * 
* After setting your symbol path, use .reload to refresh symbol locations. * 
**************************************************************************** 
Executable search path is: 
ModLoad: 00000001`3f2f0000 00000001`3f30b000 MaxTo64.exe 
ModLoad: 00000000`77160000 00000000`772e0000 ntdll.dll 
ModLoad: 00000000`77030000 00000000`7715b000 C:\Windows\system32\kernel32.dll 
ModLoad: 00000001`80000000 00000001`80011000 C:\Program Files (x86)\MaxTo\Hooker.dll 
ModLoad: 00000000`76f60000 00000000`7702d000 C:\Windows\system32\USER32.dll 
ModLoad: 000007fe`fed70000 000007fe`fedd3000 C:\Windows\system32\GDI32.dll 
ModLoad: 000007fe`fea20000 000007fe`feb28000 C:\Windows\system32\ADVAPI32.dll 
ModLoad: 000007fe`fe850000 000007fe`fe98f000 C:\Windows\system32\RPCRT4.dll 
ModLoad: 000007fe`fd8b0000 000007fe`fe502000 C:\Windows\system32\SHELL32.dll 
ModLoad: 000007fe`fef70000 000007fe`ff00c000 C:\Windows\system32\msvcrt.dll 
ModLoad: 000007fe`feee0000 000007fe`fef53000 C:\Windows\system32\SHLWAPI.dll 
(3a4.964): Break instruction exception - code 80000003 (first chance) 
*** ERROR: Symbol file could not be found. Defaulted to export symbols for ntdll.dll - 
ntdll!DbgBreakPoint: 
00000000`771a4ea0 cc    int  3 
0:000> g 
ModLoad: 000007fe`fe780000 000007fe`fe7ad000 C:\Windows\system32\IMM32.DLL 
ModLoad: 000007fe`ff010000 000007fe`ff111000 C:\Windows\system32\MSCTF.dll 
ModLoad: 000007fe`feed0000 000007fe`feedd000 C:\Windows\system32\LPK.DLL 
ModLoad: 000007fe`fede0000 000007fe`fee7a000 C:\Windows\system32\USP10.dll 
ModLoad: 000007fe`fc150000 000007fe`fc349000 C:\Windows\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.6001.18000_none_152e7382f3bd50c6\comctl32.dll 
(3a4.964): Access violation - code c0000005 (first chance) 
First chance exceptions are reported before any exception handling. 
This exception may be expected and handled. 
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\Windows\system32\USER32.dll - 
USER32!DisableProcessWindowsGhosting+0x1a: 
00000000`76f836d6 66f2af   repne scas word ptr [rdi] 
*** ERROR: Module load completed but symbols could not be loaded for MaxTo64.exe 
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\Windows\system32\kernel32.dll - 

在这一点上,调用堆栈:

USER32!DisableProcessWindowsGhosting+0x1a 
USER32!ChangeWindowMessageFilter+0x12d 
USER32!RegisterClassExW+0x25 
MaxTo64+0x11e4 
MaxTo64+0x1075 
MaxTo64+0x1920 
kernel32!BaseThreadInitThunk+0xd 
ntdll!RtlUserThreadStart+0x21 

这似乎是在MyRegisterClass,它看起来像这样:

ATOM MyRegisterClass(HINSTANCE hInstance) 
{ 
WNDCLASSEX wcex; 

wcex.cbSize = sizeof(WNDCLASSEX); 

wcex.style   = CS_HREDRAW | CS_VREDRAW; 
wcex.lpfnWndProc = WndProc; 
wcex.cbClsExtra  = 0; 
wcex.cbWndExtra  = 0; 
wcex.hInstance  = hInstance; 
wcex.hIcon   = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MAXTO64)); 
wcex.hCursor  = LoadCursor(NULL, IDC_ARROW); 
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); 
wcex.lpszClassName = szWindowClass; 
wcex.hIconSm  = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); 

return RegisterClassEx(&wcex); 
} 

编辑:原来,问题是我自己愚蠢的错误。显然,WNDCLASSEX结构中有一个字段未正确初始化。奇怪的是,这在Vista上崩溃,但在Windows 7上崩溃。添加这个可以解决问题。

wcex.lpszMenuName = NULL; 
+0

如果你没有明确地清零一个结构,它的内容是随机数 - 在声明后尝试一个ZeroMemory – 2009-02-24 20:23:35

回答

5

认真有没有什么我们可以从数据推断:

我建议做以下项目中的至少一个

编辑: 看只有你调试跟踪后,我刚出来有两个可能出现的问题:

  • 你不ZeroMemory WNDCLASSEX,也许Vista中尝试使用lpszMenuName。
  • Win7是测试版,可能是隐藏了一个错误。

但是你仍然没有显示太多的代码和跟踪是不完整的,所以很难断言一些东西,而不是psychic

如果您将VS生成的.pdb复制到Vista机器上,与您的.exe文件位于同一个文件夹中,您将获得更有意义的跟踪。

1

调试器怎么样?一些代码崩溃的地方?另外,不要做一些愚蠢的事情,例如将指针存储在int中 - 它不再适合。

0

您有访问冲突,您很可能尝试读取或写入无效内存。

+0

是的,这是不言自明的。但是,为什么在装有VS 2008的机器上工作的很好? – 2009-02-24 17:31:44

+0

您是否在机器上安装vcredist? – 2009-02-24 17:33:41

3

安装Windows调试工具,并得到一个真正的回溯 - 这应导致您发生了什么

0

异常代码0000005是访问冲突:你的程序试图写入或从内存中它没有自己的读,最有可能的。这在C/C++中的常见原因是使用空指针。由于USER32.dll发生异常,您可能传递了空指针。由于您使用的是C++,因此它可能涉及对象而不是结构,或者包含USER32.dll函数的某些对象/类中的方法。

相关问题