Почему происходит сбой моего 64-разрядного приложения на C ++? - PullRequest
1 голос
/ 24 февраля 2009

Я написал очень маленькое 64-битное приложение, которое вылетает в чистых установках Windows Vista x64. На моем компьютере для разработки (Windows 7 64-bit) он работает нормально, на котором установлена ​​Visual Studio 2008.

64-разрядное приложение C ++ (неуправляемое) запускается 32-разрядным приложением .NET и сразу же завершает работу с ошибкой нарушения доступа. Вот что говорит Event Viewer:

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-пакета он вылетал по-другому, с ошибкой конфигурации рядом.

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

Ответы [ 5 ]

5 голосов
/ 24 февраля 2009

Серьезно, мы мало что можем сделать из ваших данных:

Советую сделать хотя бы один из следующих пунктов

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

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

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

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

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

3 голосов
/ 24 февраля 2009

Установите средства отладки для Windows и получите реальный след - это должно привести вас к происходящему

1 голос
/ 24 февраля 2009

Как насчет отладчика? Какой-то код, где он падает?

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

0 голосов
/ 24 февраля 2009

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

0 голосов
/ 24 февраля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...