c++ - 为什么我的 64 位 C++ 应用程序崩溃了?

标签 c++ visual-studio-2008 visual-c++

我编写了一个非常小的 64 位应用程序,它在全新安装 Windows Vista x64 时崩溃。它在我安装了 Visual Studio 2008 的开发机器(Windows 7 64 位)上运行顺利。

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 x86、2008 x64、2008 SP1 x86 和 2008 SP1 x64),所以这应该不是问题所在。 编辑:可能值得一提的是,在安装 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;

最佳答案

说真的,我们无法从您的数据中推断出太多信息:

我建议至少做以下一项

编辑: 在只看了你的调试跟踪后,我发现了两个可能的问题:

  • 您没有 ZeroMemory WNDCLASSEX,所以 Vista 可能正在尝试使用 lpszMenuName。
  • Win7 是测试版,可能隐藏了一个错误。

但是您仍然没有显示太多代码并且跟踪不完整,因此很难在不psychic 的情况下断言某些内容。 .

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

关于c++ - 为什么我的 64 位 C++ 应用程序崩溃了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/582665/

相关文章:

c++ - boost 区间算术和三角函数

C++:多线程和引用计数对象

winforms - Winforms Designer 如何实例化我的表单?

visual-c++ - 如何将 H264 DS Filter 与 Directshow GraphEdit 结合使用

visual-studio - 如何设置命令参数以在 Visual Studio 的 C++ 探查器中启动?

c++ - 生成运算符的签名=()?

c++ - 如何获取自动(局部)变量相对于堆栈帧的偏移量( __builtin_frame_address )

c# - 在 C# - C++/CLI - C++ Windows 窗体应用程序退出之前跟踪 - 并正确结束 - native 和托管线程

c - Visual Studio 2008不显示结构指针的成员值

c++ - 从 Windows 上的 lib 文件中删除符号