Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Зависание винды при установки брейкпоинта, во вторичним потоке 
V
    Опции темы
neosapient
Дата 21.4.2007, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 16.8.2006

Репутация: 3
Всего: 4



Доброе время суток, Всем.

В общем жалавался я уже на свою проблему, но похоже виновником ошибся, а проблема осталась.

Пользуюсь VC7 (и на VC6 проверял - теже тормаза)
Есть главный поток, отвечающий за GUI. Он запускает дочерний поток, который делает расчеты.
Так вот, я хочу проверить правильность работы алгоритма и я ставлю брейкпоинт в начале алгоритма, вставленого в дочерний поток. 

И тут ... всё начинает по сумашедшиму тормазить  smile. Запускаю диспетчер задач и вижу, что процессор не загружен, что никто файлом подкачки активно не пользуется. А между тем контролы различных приложений, резко тормазят в реакциях на события.

Так было и пол года назад, я думал, что проблемы вызывает антивирус, но...
Получив новое задание (в котором без отладки кода в дочернем потоке не обойтись) и помня о замарочках, я поставил голую винду и на неё VC6, а тормаза остались.
Вывод: тормаза возникают из-за внутренних конфликтов с правами доступа для трассировки дочернего(их) потока(ов)

КАК УБРАТЬ ТОРМАЗА???
 smile 

Это сообщение отредактировал(а) neosapient - 22.4.2007, 11:21
PM MAIL   Вверх
W4FhLF
Дата 22.4.2007, 07:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 12
Всего: 121



Пользуйся нормальными отладчиками, вроде тех, что в IDA или OllyDBG. 

И определись что тебе всё-таки надо:

Цитата(neosapient @  21.4.2007,  21:34 Найти цитируемый пост)
 вставленого в дочерний поток. 


или

Цитата(neosapient @  21.4.2007,  21:34 Найти цитируемый пост)
в котором без отладки кода в дочернем процессе не обойтись


Процесс или поток? 

+ приоритеты процессов посмотри, одинаковые?



--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
neosapient
Дата 22.4.2007, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 16.8.2006

Репутация: 3
Всего: 4



Цитата

Процесс или поток? 


Потоки (а там опечатка, я её исправил)

Цитата

приоритеты процессов посмотри, одинаковые?

Я приоритеты не меняю, так что по умолчанию
PM MAIL   Вверх
korbian
Дата 23.4.2007, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 336
Регистрация: 20.2.2007
Где: Penza

Репутация: 9
Всего: 14



 smile 
Давай исходник дочернего потока.
Была схожая проблема, loop-ился в главной фнукции до ожидания заполнения структуры данных(постоянно!!!), исправил синхронизацией, с использованием мьютекса или евента.


--------------------
korbian ©
PM   Вверх
Earnest
Дата 23.4.2007, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



neosapient, вывод однозначный: что-то не так с твоими потоками. Потому что правильные потоки отлаживаются в VC 6 совершенно нормально. Нужен не только исходник потоковой функции, но и код запуска.
А может ты условную точку прерывания ставишь? Тогда не только интерфейс - все тормозит по страшному...  


--------------------
...
PM   Вверх
korbian
Дата 23.4.2007, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 336
Регистрация: 20.2.2007
Где: Penza

Репутация: 9
Всего: 14



Цитата(Earnest @  23.4.2007,  11:55 Найти цитируемый пост)
А может ты условную точку прерывания ставишь?

Это как, поясни, пожалуйста?


--------------------
korbian ©
PM   Вверх
Earnest
Дата 23.4.2007, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Как-как... точка прерывания, которая срабатывает не при любом прохождении потока управления через нее, а при выполнении заданного условия. Ну скажем, тебе надо в цикле из 1000 итераций отладить 654-ю. Не будешь же ты 653 раза на Run жать... "Обычные" точки прерывания реализуются подменой команды в коде, а условные - это, надо полагать, уже накрутка в среде, вот и тормозят не по-детски...


--------------------
...
PM   Вверх
neosapient
Дата 23.4.2007, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 16.8.2006

Репутация: 3
Всего: 4



Цитата(korbian @  23.4.2007,  09:52 Найти цитируемый пост)
Давай исходник дочернего потока.


Прикрепил в приложении

А брейк поинт ставлю в функции GenerateSymbol()Save2DMassive(...)Load2DMassive(...)
Которые вызываются из потока ThreadFunc(...)

Код

// подключаем стандартные контролы
#include <windows.h>
#include <mmsystem.h>        // Подключаем системную библеотеку 
#pragma comment (lib,"Winmm.lib")
//#include <stdlib.h>
//#include <stdio.h>
#include <time.h>
#include <math.h>

#include "resource.h"

HINSTANCE hInst;
HWND hMainDlg;
HANDLE hThread;

#define NUM_SYMB 3

#define START_SYMBOL 'a'
#define FILE_NAME_Symbol "_Symbol.txt"
unsigned char Symbol[NUM_SYMB];

#define ASC(a) a<0?-a:a
void GenerateSymbol(void)
{
    int i;
    for(i=0;i<NUM_SYMB;i++){
        Symbol[i]=START_SYMBOL+i;
    }
}

void Save2DMassive(char* pzFileName, unsigned char * pMas, int y, int x, int SizeOf)
{
    int i,j,k;
    DWORD retFile;
    if(pzFileName!=NULL&&pMas!=NULL){
        //FILE* file;
        //file = fopen(pzFileName,"w");
        HANDLE m_file=CreateFile(pzFileName,GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,
                        NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
        for(j=0;j<y;j++){
            for(i=0;i<x;i++){
                //for(k=0;k<SizeOf;k++){
                    //putc(*(pMas+(j*x+i)*SizeOf+k),file);
                //}
                WriteFile(m_file,(pMas+(j*x+i)*SizeOf),SizeOf,&retFile,NULL);
            }
            //putc('\n',file);
            WriteFile(m_file,"\r\n",2,&retFile,NULL);
        }
        //fclose(file);
        CloseHandle(m_file);
    }
}

void Load2DMassive(char* pzFileName, unsigned char * pMas, const int y, const int x, int SizeOf)
{
    int i,j,k;
    char buf[2];
    DWORD retFile;
    if(pzFileName!=NULL&&pMas!=NULL){
        //FILE* pFile;
        //pFile = fopen(pzFileName,"r");
        HANDLE m_file=CreateFile(pzFileName,GENERIC_READ,FILE_SHARE_READ | FILE_SHARE_WRITE,
                        NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
        for(j=0;j<y;j++){
            for(i=0;i<x;i++){
                //for(k=0;k<SizeOf;k++){
                    //*(pMas+(j*x+i)*SizeOf+k) = getc(pFile);
                //}
                ReadFile(m_file,(pMas+(j*x+i)*SizeOf),SizeOf,&retFile,NULL);
            }
            ReadFile(m_file,buf,2,&retFile,NULL);
        }
        //fclose(pFile);
        CloseHandle(m_file);
    }
}

DWORD WINAPI ThreadFunc( LPVOID lpParam ) 
{
    GenerateSymbol();
    Save2DMassive(FILE_NAME_Symbol,(unsigned char *)Symbol,1,NUM_SYMB,sizeof(unsigned char));
    Load2DMassive(FILE_NAME_Symbol,(unsigned char *)Symbol,1,NUM_SYMB,sizeof(unsigned char));

    return 0;



BOOL  CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    switch (message) 
    {
    case WM_INITDIALOG:
        hMainDlg  = hDlg;
        hThread = CreateThread(NULL, 0, ThreadFunc, 0, 0, 0);
        break;
    case WM_COMMAND:
        wmId    = LOWORD(wParam); 
        wmEvent = HIWORD(wParam); 
        // Parse the menu selections:
        switch (wmId)
        {
        case IDOK:
            break;
        case IDCANCEL:
            DestroyWindow(hDlg);
            break;
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default: 
        return FALSE; 
    }
return TRUE;
}

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    hInst = hInstance;
    DialogBox(hInst,MAKEINTRESOURCE(IDD_DIALOG1),0,DlgProc);
    return 0;
}


Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  Demo.rar 5,32 Kb
PM MAIL   Вверх
korbian
Дата 24.4.2007, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 336
Регистрация: 20.2.2007
Где: Penza

Репутация: 9
Всего: 14



У меня симптомы, к сожалению  smile , не проявились.
по коду:
Нет CloseHandle(hThread) и вместо CreateThread() лучше использовать _beginthreadex()(все равно ведь под VC++ пишешь)


--------------------
korbian ©
PM   Вверх
neosapient
Дата 24.4.2007, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 16.8.2006

Репутация: 3
Всего: 4



Цитата

У меня симптомы, к сожалению   , не проявились.


Ставишь breakpoint. 

три-пять раз: запускаешь (F5), трассируешь (F11)

Симптомы появятся

Это сообщение отредактировал(а) neosapient - 24.4.2007, 17:16
PM MAIL   Вверх
GremlinProg
Дата 24.4.2007, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



ну, что тут сказать, проблема довольно распространенная, в вижах она проявляется не так уж сильно, у борланда все намного печальнее: при дебаге дочернего процесса step-by-step замирает через раз на 20-30 секунд, при этом, замирает винда, ощущение такое, что происходит вторжение на уровне ядра, при том, что в вижах нечто подобное отнимает порядка 10-15 секунд. Очевидно, тут дело не в коде. Подозреваю, что дебагеры используют функции ожидания типа WaitForSingleObject, применительно к отлаживаемым потокам, а так как момент синхронизации подразумевает только 2-х участников, то 3-й (дебагер) каким-то образом нарушает эту эдилию. Вижи верно ставят интервал задержки поменьше, но проблема все таки остается...

...есть смысл вместо отладки многопоточных приложений переходить на их тестирование: дампирование, ведение лога, и т.п. К тому же это относится только к дочерним потокам, основной эта тема не затрагивает, по крайней мере, это все таки куда проще, нежели отлаживать например хуки: пока хук не снял, системе управление не вернется , отсюда все вытекающие...


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Aleksandor
Дата 25.4.2007, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Практик
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 22.11.2005
Где: россия, зеленогра д

Репутация: 10
Всего: 12



А вот это не разгадка?

В двух словах — если у Вас VS 2005 (в статье говорится что та же проблема бывает и с 6.0 и 2003) периодически в момент дебага жутко "тормозит" всю систему — поставьте флажок в:

Control Panel/Regional And Language Options/Language/Details/Advanced/Turn off advanced text services.

И обязательно перегрузитесь!
После этого исчезнет Language Bar, но переключение раскладок работать будет.


--------------------
Call out Gouranga be happy!!!
Gouranga Gouranga Gouranga ....
That which brings the highest happiness!!
PM MAIL   Вверх
neosapient
Дата 25.4.2007, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 16.8.2006

Репутация: 3
Всего: 4



Цитата

Control Panel/Regional And Language Options/Language/Details/Advanced/Turn off advanced text services.


Переведу
Пуск -> Настройки -> Панель управления -> Языки и региональные стандарты -> 
вкладка Языки -> Подробнее -> 
вкладка Дополнительно -> поставить галочку Выключить дополнительные текстовые службы

Один минус раскладка клавиатуры отменена (если не перегрузиться), т.е. писать можно только на английском

Вроде помогло  smile 

Это сообщение отредактировал(а) neosapient - 25.4.2007, 21:21
PM MAIL   Вверх
Earnest
Дата 26.4.2007, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Aleksandor, очень интересная инфа.
У меня, правда, опция оказалась выключенной, и, насколько помню, никогда ее не включала. Наверное, поэтому с такой проблемой не сталкивалась. 
neosapient тебе должен целый ящик репутаций... 


--------------------
...
PM   Вверх
GremlinProg
Дата 2.5.2007, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



К сожалению, эта опция не решила проблему, по крайней мере в борланде, надо думать дальше...


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0903 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.