Форум программистов, компьютерный форум CyberForum.ru

Visual Studio

Войти
Регистрация
Восстановить пароль
 
 
Leardjiny
0 / 0 / 1
Регистрация: 22.09.2013
Сообщений: 135
#1

Зависает часть кода - Visual Studio

11.01.2017, 09:15. Просмотров 477. Ответов 28
Метки нет (Все метки)

Добрый день.
У меня Visual Studio 2010, пользуюсь уже давно, но вчера столкнулся с такой проблемой:

Есть исходный код, где объявлен класс с функциями и т.д. Во время отладки ставлю в этом файле точки останова и все вроде нормально работает. Но есть функция (в том же самом файле, и из того же самого класса что и остальные), в которой если поставить точку останова, то вместо этого открывается окно с записью "Нет доступных исходных файлов. Не загружена символьная информация ни для одного кадра стека вызовов. Невозможно показать исходный код."

При этом все вроде как работает, т.к. результаты функции возвращаются и ошибок нет. Так же иногда после такого сообщения точка останова все же срабатывает (как будто с большим запозданием), но дебаг при этом тормозит - каждая строчка занимает 2-3 секунды почему-то.

Странно, что в том же файле и классе остальные функции работают нормально, а такая ситуация лишь с одной функцией.

Второй день разбираюсь с проблемой. Загрузку символов Майкрософт уже отключил - не помогло (да и при включенной в код других функций все равно заходило, просто дебаг тормозил все время, а не на одной функции).

Подскажите пожалуйста, в чем может быть дело?
Раньше все работало нормально, может я что-то не так в настройках случайно сделал?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.01.2017, 09:15     Зависает часть кода
Посмотрите здесь:

Как спрятать большую часть кода - Visual Studio
у меня есть массив 27*27 он очень громоздкий можно ли как нибудь облегчить файл program? может класс создать какой нибудь или...

При установке С++ VS зависает - Visual Studio
Несколько раз перезагружал, чистил temp, не помогает. каждый раз при попытке установить С++ через project->new->download cpp, появляется...

VS 2013 Зависает при линковке - Visual Studio
Недавно возникла такая проблема: когда собираю проект, студия зависает - приходится снимать её через диспетчер. После перезапуска студии...

VS 2013 Установка зависает на определённом моменте - Visual Studio
в общем такое дело: переустановил винду (7-ка), начал ставить студию (pro 2013 с офф сайта образом скачал), смотрю зависло на установке...

Зависает установка Microsoft Visual C# - Visual Studio
И так вся проблема в том что при установке Microsoft Visual C# у меня доходит до этапа установки VC 9.0 Runtime (x86) Вообщем вот скрин

Зависает Visual Studio 2015 на Windows 10 Pro - Visual Studio
Ребят, недавно обновился до Win10 и VS2015 и тут был разочарован тем что при запуске примерно через 5 минут зависает студия полностью......

Зависает VS 2015 Enterprise после запуска отладчика - Visual Studio
В общем, стоит у меня ССД и хороший процессор. Сборка всегда проходила моментально. Но сегодня я решил обновить некоторые компоненты и,...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Usaga
1683 / 1325 / 236
Регистрация: 21.01.2016
Сообщений: 4,831
Завершенные тесты: 2
11.01.2017, 11:18     Зависает часть кода #2
Цитата Сообщение от Leardjiny Посмотреть сообщение
Раньше все работало нормально, может я что-то не так в настройках случайно сделал?
Ну это тебе должно быть видней. Мы тут не телепаты
Leardjiny
0 / 0 / 1
Регистрация: 22.09.2013
Сообщений: 135
11.01.2017, 11:21  [ТС]     Зависает часть кода #3
Цитата Сообщение от Usaga Посмотреть сообщение
Ну это тебе должно быть видней. Мы тут не телепаты
Так я потому и спрашиваю - в чем проблема может быть)
Т.к. я вроде ничего и не настраивал, а все что менял - обратно откатил)
Usaga
1683 / 1325 / 236
Регистрация: 21.01.2016
Сообщений: 4,831
Завершенные тесты: 2
11.01.2017, 11:23     Зависает часть кода #4
Leardjiny, очень сложно сказать что-то конкретное по этому поводу.
Leardjiny
0 / 0 / 1
Регистрация: 22.09.2013
Сообщений: 135
11.01.2017, 11:32  [ТС]     Зависает часть кода #5
Еще заметил такой момент.
Дебаг в функцию не заходит когда должен, но изредка точка останова срабатывает с каким-то сильным запозданием (я уже писал об этом).

Если посмотреть в это время потоки, то указан почему-то вообще другой поток, чем должен быть. Все остальные функции отображаются в ином потоке, а эта вызывается из них, потому теоретически тоже должна быть в том же потоке.
OwenGlendower
Модератор
Эксперт .NET
6228 / 5232 / 1907
Регистрация: 17.03.2014
Сообщений: 9,907
Записей в блоге: 1
11.01.2017, 12:58     Зависает часть кода #6
Leardjiny, попробуй сделать банальные вещи сначала (если еще не делал): очистить папки bin, obj; папки временных файлов C:\Windows\Temp, %TEMP% и перезагрузи комп. Вдруг поможет
Leardjiny
0 / 0 / 1
Регистрация: 22.09.2013
Сообщений: 135
11.01.2017, 15:34  [ТС]     Зависает часть кода #7
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Leardjiny, попробуй сделать банальные вещи сначала (если еще не делал): очистить папки bin, obj; папки временных файлов C:\Windows\Temp, %TEMP% и перезагрузи комп. Вдруг поможет
OwenGlendower, попробовал с папкой TEMP. Все остальное уже делал)) Не помогло... хоть студию переустанавливать.

Добавлено через 1 час 42 минуты
Проверил полностью файлик. Работают все функции класса, кроме одной. Пробовал ее и переименовывать и дублировать. Ситуация повторяется и после переименовывания и при дублировании.

Может с функцией что-то не так?

Это объявление ее в классе:
C++
1
bool        FormModel(int profile_id, float FDDS = 0.0, float FADC = 0.0, float FFPGA = 0.0, float FFRRW = 0.0);
Это ее определение:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
bool COrwellR_DSP::FormModel(int profile_id, float fdds, float fadc, float ffpga, float ffrrw)
{
    if (profile_id >= kProfilesNumber || profile_id != m_signals[profile_id].profile.id || profile_id <= 0)
    {
        return false;
    }
 
    float cur_fadc, cur_fdds, cur_ffpga, cur_ffrrw;
    if (fdds > 0.0)
        cur_fdds = fdds*1000000;
    else
        cur_fdds = kFrequencyDDS;
 
    if (fadc > 0.0)
        cur_fadc = fadc*1000000;
    else
        cur_fadc = kFrequencyADC;
 
    if (ffpga > 0.0)
        cur_ffpga = ffpga*1000000;
    else
        cur_ffpga = kFrequencyFPGA;
 
    if (ffrrw > 0.0)
        cur_ffrrw = ffrrw*1000000;
    else
        cur_ffrrw = kFrequencyFRRW;
 
    bool            res=false;
    float           signalModelRe[kOrwrMaxRange];
    float           signalModelIm[kOrwrMaxRange];
    float           window[kOrwrMaxRange];
    float           p;
    int32_t         clc_koeff = static_cast<int32_t>(cur_fadc/cur_ffpga);
    int32_t         freq_koeff = static_cast<int32_t>(cur_fdds/cur_fadc);
    //IPP
    IppStatus       r0 = ippStsNoErr, r1 = ippStsNoErr, r2 = ippStsNoErr;
 
    memset(signalModelRe, 0, kOrwrMaxRange*sizeof(float));//zero desired signal 
    memset(signalModelIm, 0, kOrwrMaxRange*sizeof(float));
 
    if (!m_init_ipp)
    {
        m_init_ipp = true;
        //инициализация ipp
        ippStaticInit();
        int32_t fft_size_ln = static_cast<int> ((log10f(static_cast<float>(kFFTmin))/log10f(2.0f))+0.5f);
        for (int i=0; i<kFFTbuffers; ++i,++fft_size_ln)
        {
            r0 = ippsFFTInitAlloc_C_32f(&m_fft_spec[i], fft_size_ln, IPP_FFT_DIV_BY_SQRTN, ippAlgHintAccurate);  //FFT-2048
            r2 = ippsFFTGetBufSize_C_32f(m_fft_spec[i],&m_ipp_buffer_size[i]);
            m_ipp_buffer[i].reset(new char[m_ipp_buffer_size[i]]);
            if ( r2 != ippStsNoErr || r0 != ippStsNoErr   )
            {
                m_init_ipp = false;
            }
        }
    }   
 
    memset(m_modelsRe[profile_id].get(), 0, m_signals[profile_id].fft_size*sizeof(float));//zero desired spectrum 
    memset(m_modelsIm[profile_id].get(), 0, m_signals[profile_id].fft_size*sizeof(float));
    int pulse_length = clc_koeff*(m_signals[profile_id].profile.dds_stop - m_signals[profile_id].profile.dds_start)/m_signals[profile_id].profile.decimation;
    memset(m_window[profile_id].get(), 0, m_windowsize[profile_id]*sizeof(float));
 
    if (pulse_length>m_windowsize[profile_id])
        pulse_length=m_windowsize[profile_id];
    
    const float     blackman1 = 0.42f;
    const float     blackman2 = 0.5f;
    const float     blackman3 = 0.08f;
 
    for( int i = 0; i < m_windowsize[profile_id]; i++)// окно Блэкмана было m_windowsize[profile_id] вместо pulse_length
    {
        m_window[profile_id][i] = (float)(blackman1 - blackman2 * cos ((2. * M_PI * i) / (m_windowsize[profile_id]-1)) + blackman3 * cos ((4. * M_PI * i) / (m_windowsize[profile_id]-1)));
    }
 
    if ( pulse_length > 0 && pulse_length <= sfera_structures::kModelSize)
    {
        if (m_signals[profile_id].profile.dftw == 0)
        {
            //////////////////////////////////////////////////////////////////////////
            //КИ
            for (int i=0,k=0; i< pulse_length; ++i)
            {
                if ( (i%m_signals[profile_id].profile.decimation)==0 )
                {
                    p=(float)(2.f*M_PI*i*m_signals[profile_id].profile.ftw/(float)(powf(2.f,31.f)));
                    signalModelRe[k]= (float)cos(p);
                    signalModelIm[k]= (float)sin(p);
                    ++k;
                }
            }
        }
        else
        {
            //////////////////////////////////////////////////////////////////////////
            //LFM
            uint32_t pw = 0; 
            uint32_t dfw = m_signals[profile_id].profile.dftw;
            uint32_t ftw = m_signals[profile_id].profile.ftw;
            uint32_t fw = ftw;
 
            for( int i = 0; i < pulse_length; i++)// окно Блэкмана
            {
                window[i] = (float)(blackman1 - blackman2 * cos ((2. * M_PI * i) / (pulse_length-1)) + blackman3 * cos ((4. * M_PI * i) / (pulse_length-1)));
            }
 
            uint32_t step =  static_cast<int>((m_signals[profile_id].profile.dfrrw*cur_fadc/cur_ffrrw)+0.5f);
            if (step == 0 )
            {
                return false;
            }
            for (int i=0,k=0; i< pulse_length; ++i)
            {
                p=(float)(pw>>1);
                p=(float)(p*2*M_PI/(float)(pow(2.,31.)));
                if ( (i%m_signals[profile_id].profile.decimation)==0 )
                {
                    if ( m_window_target == 1)
                    {
                        signalModelRe[k]= window[i]*(float)cos(p);
                        signalModelIm[k]= window[i]*(float)sin(p);
                    }
                    else
                    {
                        signalModelRe[k]= (float)cos(p);
                        signalModelIm[k]= (float)sin(p);
                    }                   
                    ++k;
                }
                for(int j=0; j<freq_koeff; j++)
                {
                    pw+=fw;
                }
                if (((i+1)%step)==0) 
                {fw+=dfw;}
            }
        }
    } 
    else
    {
        return false;
    }
    
    int32_t buff_num = static_cast<int>( static_cast<int>((log10f(static_cast<float>(m_signals[profile_id].fft_size))/log10f(2.0f))+0.5f)- static_cast<int> ((log10f(static_cast<float>(kFFTmin))/log10f(2.0f))+0.5f));
    
    if ( buff_num < kFFTbuffers)
    {
        //получаем спектр эталона
        r1 = ippsFFTFwd_CToC_32f((const Ipp32f*)signalModelRe,
            (const Ipp32f*)signalModelIm, 
            (Ipp32f*)m_modelsRe[profile_id].get(), 
            (Ipp32f*)m_modelsIm[profile_id].get(),
            m_fft_spec[buff_num], 
            (Ipp8u*)m_ipp_buffer[buff_num].get()); 
        (r1 == ippStsNoErr) ?  res=true : res =false;
    }
    
    return res;
}
Кстати, если после 30 строчки просто добавить какой-нибудь массив из 100000 элементов
C++
1
float qwe[100000];
просто объявить и ничего с ним не делать.
То как только доходит до этой функции - вылетает ошибка о нарушении памяти (как будто вылез за пределы массива и т п).

При этом больше ничего не меняется. Такого я как то не понимаю уже(
nd2
2011 / 1597 / 561
Регистрация: 29.01.2016
Сообщений: 5,049
12.01.2017, 01:29     Зависает часть кода #8
Возможно, UB в коде присутствует. Может, где-то в функции, за пределы выделенной памяти выходишь.
Leardjiny
0 / 0 / 1
Регистрация: 22.09.2013
Сообщений: 135
12.01.2017, 08:40  [ТС]     Зависает часть кода #9
Цитата Сообщение от nd2 Посмотреть сообщение
Возможно, UB в коде присутствует. Может, где-то в функции, за пределы выделенной памяти выходишь
А почему это всегда работает, и проявляется только при выделении памяти под массив в 100к элементов? Я же по сути только память выделил, а больше ничего и не менял. В моем представлении это вообще не должно было повлиять никак, только объем выделяемой памяти больше стал и все.
Usaga
1683 / 1325 / 236
Регистрация: 21.01.2016
Сообщений: 4,831
Завершенные тесты: 2
12.01.2017, 08:47     Зависает часть кода #10
Цитата Сообщение от Leardjiny Посмотреть сообщение
проявляется только при выделении памяти под массив в 100к элементов?
Так, а где ты такой массив выделяешь? В стёке? Ты же знаешь, что он не резиновый?
Leardjiny
0 / 0 / 1
Регистрация: 22.09.2013
Сообщений: 135
12.01.2017, 09:38  [ТС]     Зависает часть кода #11
Usaga, Знаю, но 100 тысяч элементов float - это не так уж и много.
Да и вот тут я выделяю на каждый массив более 100к элементов. И все работало (ставил и больше), как только вылезла эта ошибка - он мне теперь не позволяет увеличивать эти массивы.
C++
1
2
3
float           signalModelRe[kOrwrMaxRange];
    float           signalModelIm[kOrwrMaxRange];
    float           window[kOrwrMaxRange];
В целом суть не в этом. Мне бы дебаг починить, чтобы эту функцию можно было отлаживать. А с размерами и выходом за пределы я уже разберусь.
Usaga
1683 / 1325 / 236
Регистрация: 21.01.2016
Сообщений: 4,831
Завершенные тесты: 2
12.01.2017, 10:05     Зависает часть кода #12
Leardjiny, проблемы с дебагом могут быть связаны с UB в твоём коде.

Цитата Сообщение от Leardjiny Посмотреть сообщение
но 100 тысяч элементов float - это не так уж и много.
При этом ты должен точно знать, сколько места в стёке свободно. А на эту информацию полагаться нельзя.

Цитата Сообщение от Leardjiny Посмотреть сообщение
Да и вот тут я выделяю на каждый массив более 100к элементов. И все работало (ставил и больше),
Не надо так. Ты не можешь знать сколько в данный момент в стёке места. Выделяй такие большие массивы данных только в куче и проблем не будет. По крайней мере таких, как та с которой ты сейчас паришься.
Leardjiny
0 / 0 / 1
Регистрация: 22.09.2013
Сообщений: 135
12.01.2017, 10:15  [ТС]     Зависает часть кода #13
Usaga, Предлагаете через malloc выделять память для буфферов?
Я конечно сейчас попробую. Но я пробовал размеры буфферов уменьшать до маленьких размеров - проблема все равно остается (дебаг не заходит).
Usaga
1683 / 1325 / 236
Регистрация: 21.01.2016
Сообщений: 4,831
Завершенные тесты: 2
12.01.2017, 10:31     Зависает часть кода #14
Leardjiny, предлагаю использовать new и delete. Или smart pointers, но в данном случае это излишне.

Добавлено через 1 минуту
Просто стёк не такой большой, чтобы в него большие массивы заталкивать безнаказанно.
Leardjiny
0 / 0 / 1
Регистрация: 22.09.2013
Сообщений: 135
12.01.2017, 11:09  [ТС]     Зависает часть кода #15
Usaga, Спасибо. Так он разрешил выделить больше размера для массивов.
Где-то есть пробел у меня, мне казалось что компилятор должен при сборке считать - сколько ему памяти для стека понадобится. Поищу литературу.

Теперь буду с ошибкой при заходе дебагом в функцию разбираться, а потом с выходом за пределы буффера.
Usaga
1683 / 1325 / 236
Регистрация: 21.01.2016
Сообщений: 4,831
Завершенные тесты: 2
12.01.2017, 11:17     Зависает часть кода #16
Leardjiny, размер стёка определяется ОС во время исполнения. Желаемый размер, вроде бы, можно и в EXE указывать (ключ компилятора) и при создании потока (каждому свой стёк), но компилятор тут особо ничего не решает.

Добавлено через 3 минуты
Цитата Сообщение от Leardjiny Посмотреть сообщение
Теперь буду с ошибкой при заходе дебагом в функцию разбираться, а потом с выходом за пределы буффера.
Я не специалист по С++ ни разу, но мне кажется, что проблема с отладчиком из-за повреждения памяти (может стёка). Выход за пределы буфера нужно исправлять в первую очередь.
Leardjiny
0 / 0 / 1
Регистрация: 22.09.2013
Сообщений: 135
12.01.2017, 11:56  [ТС]     Зависает часть кода #17
Usaga, да, Вы правы. Была проблема что в рассчете спектра входной и выходной массивы - разных размеров. Из-за этого и падало, хотя в описании функции такого требования не указано. Да и теория этого не требует.

Поправил выход за пределы памяти - дебаг сразу стал заходить в функцию и не тормозит при этом.
Странно - с выходом за пределы памяти сталкиваюсь часто, но такой эффект от этого вижу впервые)

Спасибо за помощь)
nd2
2011 / 1597 / 561
Регистрация: 29.01.2016
Сообщений: 5,049
12.01.2017, 16:48     Зависает часть кода #18
Цитата Сообщение от Leardjiny Посмотреть сообщение
А почему это всегда работает,
Вот это не есть нормальная работа, хотя, UB может ввобще не проявляться:
Цитата Сообщение от Leardjiny Посмотреть сообщение
Но есть функция (в том же самом файле, и из того же самого класса что и остальные), в которой если поставить точку останова, то вместо этого открывается окно с записью "Нет доступных исходных файлов. Не загружена символьная информация ни для одного кадра стека вызовов. Невозможно показать исходный код."
При этом все вроде как работает, т.к. результаты функции возвращаются и ошибок нет. Так же иногда после такого сообщения точка останова все же срабатывает (как будто с большим запозданием), но дебаг при этом тормозит - каждая строчка занимает 2-3 секунды почему-то.
Странно, что в том же файле и классе остальные функции работают нормально, а такая ситуация лишь с одной функцией.
Цитата Сообщение от Leardjiny Посмотреть сообщение
Usaga, да, Вы правы. Была проблема что в рассчете спектра входной и выходной массивы - разных размеров. Из-за этого и падало, хотя в описании функции такого требования не указано. Да и теория этого не требует.
Поправил выход за пределы памяти - дебаг сразу стал заходить в функцию и не тормозит при этом.
А я был не прав?
Цитата Сообщение от nd2 Посмотреть сообщение
Может, где-то в функции, за пределы выделенной памяти выходишь.
Добавлено через 2 минуты
Цитата Сообщение от Leardjiny Посмотреть сообщение
Странно - с выходом за пределы памяти сталкиваюсь часто, но такой эффект от этого вижу впервые)
На то оно и UB, чтобы проявляться по-разному (неопределённо), в том числе, и не проявляться.
Leardjiny
0 / 0 / 1
Регистрация: 22.09.2013
Сообщений: 135
12.01.2017, 17:25  [ТС]     Зависает часть кода #19
Цитата Сообщение от nd2 Посмотреть сообщение
На то оно и UB, чтобы проявляться по-разному (неопределённо), в том числе, и не проявляться.
Ну теперь такой вариант тоже буду знать.
А вариант о переполнении стека мне даже в голову не приходил, до этого не сталкивался ни разу просто. Потому до причины выхода за пределы памяти для меня сложно было догадаться.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.01.2017, 17:38     Зависает часть кода
Еще ссылки по теме:

При создании инсталляционного пакета зависает visual studio - Visual Studio
Здравствуйте. Хочу собрать инсталляционный пакет. При выборе создать-проект VS 2012 зависает. Есть ли другой метод?

Не устанавливается ни одна visual studio! зависает на установке net fraimwork 4, - Visual Studio
(в VS 2012 при применении обновления kb2664825) Видел топик что после установки дров она не хочет ставится, а на чистую систему станвится...

Как вытащить часть кода из кода страницы? - C#
Знаю, что можно через json как-то. Вот например есть код страницы, на нем есть несколько одинаковых блоков. Нужно вытащить определенный...

Клиентская часть постоянно зависает при закрытии потока - C#
Всем доброго времени суток! Написал приложение работающее по TCP. Проблема в том, что при закрытии клиентской части постоянно зависает...

Lenovo IdeaPad Z580A (59-348927) при давлении на левую часть зависает и появляются артефакты - Ремонт ноутбуков
Уже как недели две такая проблема появилась: если надавать на левую часть ноутбука, он зависает а на дисплее появляются артефакты в виде...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
nd2
2011 / 1597 / 561
Регистрация: 29.01.2016
Сообщений: 5,049
12.01.2017, 17:38     Зависает часть кода #20
Цитата Сообщение от Leardjiny Посмотреть сообщение
А вариант о переполнении стека мне даже в голову не приходил, до этого не сталкивался ни разу просто. Потому до причины выхода за пределы памяти для меня сложно было догадаться.
Переполнение стека - это одно. Об этом, в дебаг, компилятор студии сообщает (stack overflow). А выход за пределы выделенной памяти - это другое.
Yandex
Объявления
12.01.2017, 17:38     Зависает часть кода
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru