Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Ошибка компиляции (прошу помощи)


Автор: gagar 21.5.2010, 09:13
Компилятор: Visual Studio C++ Express Edition 2008 

В чем проблема: программа начинает выполняться и вылетает Access Violation.

Исходный код (на том месте, где вылетает программа):

Код

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
    //  -----------------------------------------------------------------------------------------
    //  ШАГ 1:

        HWND hWnd;
        hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной переменной
    
    //  -----------------------------------------------------------------------------------------
    //  ШАГ 2: Создаем окно

        hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
                            CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
        
        if (!hWnd)
        {
            return FALSE;
        }
        
        ShowWindow(hWnd, nCmdShow);
        UpdateWindow(hWnd);

    //  -----------------------------------------------------------------------------------------
    //  ШАГ 4: Устанавливаем соединение с базой данных

        //db.connect();
        
    //  -----------------------------------------------------------------------------------------
    //  ШАГ 5: Запускаем поток сбора новостных сообщений

        HANDLE hThread;
        DWORD  dwThreadID;

// !!! ВОТ ТУТ ВЫЛЕТАЕТ !!!
        hThread = CreateThread(NULL,0,ClearThread,0,0,&dwThreadID);
        
    //  -----------------------------------------------------------------------------------------
        return TRUE;
}


Вылетает в 35 строке!

Что пишет отладчик:

Код

"smip.clear.exe": Загружено: "E:\smip\smip.clear\Debug\smip.clear.exe", Символы загружены.
"smip.clear.exe": Загружено "C:\WINDOWS\system32\ntdll.dll"
"smip.clear.exe": Загружено "C:\WINDOWS\system32\kernel32.dll"
"smip.clear.exe": Загружено "C:\WINDOWS\system32\user32.dll"
"smip.clear.exe": Загружено "C:\WINDOWS\system32\gdi32.dll"
"smip.clear.exe": Загружено "C:\WINDOWS\system32\advapi32.dll"
"smip.clear.exe": Загружено "C:\WINDOWS\system32\rpcrt4.dll"
"smip.clear.exe": Загружено "C:\WINDOWS\system32\secur32.dll"
"smip.clear.exe": Загружено "C:\WINDOWS\system32\libmySQL.dll"
"smip.clear.exe": Загружено "C:\WINDOWS\system32\wsock32.dll"
"smip.clear.exe": Загружено "C:\WINDOWS\system32\ws2_32.dll"
"smip.clear.exe": Загружено "C:\WINDOWS\system32\msvcrt.dll"
"smip.clear.exe": Загружено "C:\WINDOWS\system32\ws2help.dll"
"smip.clear.exe": Загружено: "C:\WINDOWS\system32\libxml2.dll", Двоичный код не был построен с отладочной информацией.
"smip.clear.exe": Загружено: "C:\WINDOWS\system32\iconv.dll", Двоичный код не был построен с отладочной информацией.
"smip.clear.exe": Загружено: "C:\WINDOWS\system32\zlib1.dll", Двоичный код не был построен с отладочной информацией.
"smip.clear.exe": Загружено: "C:\WINDOWS\system32\curllib.dll", Двоичный код не был построен с отладочной информацией.
"smip.clear.exe": Загружено: "C:\WINDOWS\system32\ssleay32.dll", Двоичный код не был построен с отладочной информацией.
"smip.clear.exe": Загружено: "C:\WINDOWS\system32\libeay32.dll", Двоичный код не был построен с отладочной информацией.
"smip.clear.exe": Загружено "C:\WINDOWS\WinSxS\x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30729.1_x-ww_6f74963e\msvcr90.dll"
"smip.clear.exe": Загружено: "C:\WINDOWS\system32\openldap.dll", Двоичный код не был построен с отладочной информацией.
"smip.clear.exe": Загружено "C:\WINDOWS\system32\libsasl.dll"
"smip.clear.exe": Загружено "C:\WINDOWS\WinSxS\x86_Microsoft.VC90.DebugCRT_1fc8b3b9a1e18e3b_9.0.30729.1_x-ww_f863c71f\msvcr90d.dll"
"smip.clear.exe": Загружено "C:\WINDOWS\system32\imm32.dll"
"smip.clear.exe": Загружено "C:\WINDOWS\system32\msctf.dll"
"smip.clear.exe": Загружено "C:\WINDOWS\system32\version.dll"
"smip.clear.exe": Выгружено: "C:\WINDOWS\system32\version.dll"
"smip.clear.exe": Загружено "C:\WINDOWS\system32\apphelp.dll"
"smip.clear.exe": Загружено "C:\WINDOWS\system32\msctfime.ime"
"smip.clear.exe": Загружено "C:\WINDOWS\system32\ole32.dll"
Первый этап обработки исключения в "0x00412ca7" в "smip.clear.exe": 0xC00000FD: Stack overflow.
Необработанное исключение в "0x00412ca7" в "smip.clear.exe": 0xC00000FD: Stack overflow.


Что в дизасемблере:

Код

00412C9A  pop         ecx  
00412C9B  xchg        eax,esp 
00412C9C  mov         eax,dword ptr [eax] 
00412C9E  mov         dword ptr [esp],eax 
00412CA1  ret              
00412CA2  sub         eax,1000h 
// !!! Вот тут косяк !!!
00412CA7  test        dword ptr [eax],eax 
00412CA9  jmp         cs10 (412C94h) 
--- Нет исходного файла --------------------------------------------------------
00412CAB  int         3    
00412CAC  int         3    
00412CAD  int         3    
00412CAE  int         3    
00412CAF  int         3    
00412CB0  int         3    
00412CB1  int         3    
00412CB2  int         3    
00412CB3  int         3    
00412CB4  int         3    
00412CB5  int         3    
strcat_s:
00412CB6  jmp         dword ptr [__imp__strcat_s (672470h)] 


Стек вызова:
Код

>    smip.clear.exe!_chkstk()  Строка 99    Asm


В чем тут может быть проблема???

Автор: gagar 21.5.2010, 12:57
Проблема решилась!

Я после создания потока, внутри функции, выполняющейся в потоке инициализировал класс, в котором есть поле данных размером 2048000 байт!!!. Которое к тому же передавалось в функцию через стек... Естественно, в такой ситуации происходило переполнение стека. Сейчас буду переписывать этот кусок кода "по человечески". 

Меня смущает только одно... почему этот косяк не обнаружился компилятором? Он вызывал переполнение стека при вызове функции CreateThread, а не позже, при создании класса, или даже при его использовании.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)