2009-02-24 2 views
1

Я написал очень маленькое 64-битное приложение, которое разбивается на чистые установки Windows Vista x64. Он работает плавно на моей машине разработки (64-разрядная версия Windows 7), в которой установлена ​​Visual Studio 2008.Почему мое 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 x86, 2008 x64, 2008 SP1 x86 и x64 2008 SP1), так что это не должно быть проблемой. Редактировать: Возможно, стоит упомянуть, что перед установкой vcredist-пакета он разбился по-разному, с ошибкой конфигурации «бок о бок».

Я 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); 
} 

EDIT: Оказывается, проблема была моя собственная глупая ошибка. По-видимому, в структуре WNDCLASSEX есть поле, которое не инициализировано должным образом. Это катастрофа на Vista, но не на Windows 7, как ни странно. Добавление этого исправляет проблему.

wcex.lpszMenuName = NULL; 
+0

Если вы явно не указали нулевую структуру, ее содержимое является случайным числом - попробуйте ZeroMemory после объявления –

ответ

5

Серьезно существует не так много мы можем сделать вывод о ваших данных: советы

I, чтобы сделать по крайней мере один из следующих элементов

  • Установите VS в Vista 64 машины
  • Настройка удаленного debug session http://msdn.microsoft.com/en-us/library/y7f5zaaa.aspx
  • Используйте OutputDebugString, чтобы распечатать информацию, где находится ваша программа, и смотреть ее с помощью DebugView, чтобы сузить место, где он сбой.

Редактировать: После просмотра только ваша трассировки я только что вышел с двумя возможными проблемами:

  • Вы не ZeroMemory WNDCLASSEX, поэтому, возможно, Vista, пытаются использовать lpszMenuName.
  • Win7 является бета-версией и, вероятно, скрывает ошибку.

Но все же вы не показываете много кода, а след неполный, поэтому сложно что-то утверждать, не будучи psychic.

Если вы копируете .pdb, сгенерированный VS, на машину Vista, в той же папке, где находится ваш .exe, у вас будет более значимая трассировка.

1

Как насчет отладчика? Некоторый код, где он сбой?

Кроме того, не делайте глупых вещей, таких как сохранение указателей в int - это больше не будет соответствовать.

0

У вас есть нарушение прав доступа, вы, скорее всего, пытаетесь прочитать или записать недопустимую память.

+0

Да, это само собой разумеется. Но почему это прекрасно работает, когда на машине с VS 2008 установлена? –

+0

Вы установили vcredist на машину? –

+0

Да, как упоминалось в вопросе. –

3

Установка средств отладки для Windows, и получить реальную трассировку - что должно привести вас к тому, что происходит

+0

См. Вывод от инструментов отладки выше, с источником, который, как представляется, является причиной проблемы. –

0

Код исключения 0xc0000005 является нарушением прав доступа: программа пыталась писать или читать из памяти, она не принадлежит, скорее всего. Общей причиной этого в C/C++ является использование нулевого указателя. Поскольку исключение произошло в USER32.dll, вы, вероятно, передали нулевой указатель. Поскольку вы используете C++, это может включать объект, а не структуру, или метод в каком-либо объекте/классе, который также обертывает функции USER32.dll.

Смежные вопросы