На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
Модераторы: Qraizer
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Поиск ошибок в Release версии
    Как осуществлять поиск ошибок в программе написанной на Visual C++ с MFC? Как я себе это представляю, то необходимо отлавливать все исключения сгенерированные программой и распечатываеть в файл содержимое стека... Чтобы по этой распечатке найти потом место в котором собственно и произошел вылет...Есть ли в MFC механизмы для этого? Функция AfxDumpStack() замечательно работает, но только в отладочной версии, а почему не работает в релизе? Подскажите, плз...
      Неужели никто не сталкивался с такой проблемой? Или я плохо сформулировал свой вопрос?
        Может RSDN тебе поможет?
        тама кое чта есть по этому вопросу
          По-моему, лучше всего протестировать нормально в DEBUG с BoundsChecker. А содержимое стека тебе и так пришлют, когда грохнется :-)).
            В релизном варианте, при компиляции и линковке не включается отладочная информация, ну там привязка к исходникам, имена функций, номера строк итп., потому AfxDumpStack не имеет достаточно инфы для работы.
            Тупой вариант зделать свой стэк, правда тебе придется каждое тело функции заворачивать в try - catch и забыть про return, вообщем гигантская работа, нужна только в больших проэектах, нормально осущевствима только на Си++, и должна быть продумана с самого начала.
            Другой, нереальный вариант, не делать ошибок :)
            Или если доверяешь клиентам пошли отладочную версию. И все дела.
            успехов
              Так а зачем искать ошибки в Release-версии? Разве отладочная версия не для этого существует?
                2tonik:
                простой пример -
                int i;
                в отладочной версии инициализируется нулем, а в релизе - не инициализируется вообще (будет содержать случайное значение). И таких различий очень много.
                  У меня например дебуг версия нормально пахала, а в релизе был редкий exception на уровне системы, я его так и не сумел отловить, вопрос там был в multithreading-е
                  когда запускался второй thread прога давала
                  exception и все.
                    2eyes
                    Так лучше самому инициализировать переменную. И разве компилер не выдаст предупреждения при использовании переменной до инициализации?
                      2tonik: Все мы люди, иногда можно чего-нибудь несущественного не заметить, а компилятор невсегда выдает предупреждения когда надо, а иногда делает это когда не надо.
                      У меня тоже были случаи когда дебаг работал нормально а релиз вызывал милое сообщение - "программа выполнила недопустимую операцию"
                        В Яве компилер это делает (предупреждает).
                        Пример:
                        int i;
                        if (some)
                        {
                        i = 123;
                        }
                        int d = i - 321; // если some == FALSE, имеем грабли.

                        Для этого в компилере надо анализировать все возможные пути исполнения кода, что в Си значительно труднее сделать.
                          К вопросу о том зачем это нужно, мне кажется риторический вопрос, тк как бы вы не тестировали программу, всё равно будут ошибки, причем, всем известная истина (пардон), чем больше программа, тем больше ошибок в ней будет... В борланде у себя в конторе мы решали это следующим образом:
                          1. при создании релиза, сохраняли для этого релиза у себя файл с отладочной информацией
                          2. в программе реализовывалась функция печати содержимого стека в файл
                          3. при всех вылетах вызывалась эта функция
                          По-моему механизм очень не плохой, тк в случае вылета клиент мог прислать нам файл с ошибкой, мы сопоставляем его с файлом отладочной инфы для этого релиза и получаем название модулей, функций и номера строк, таким образом можно локализовать ошибку, вот я и подумал, что, может быть, есть какие-то подобные стандартные механизмы в том же MFC ?
                          Посоветуйте, подскажите, буду очень благодарен...
                            NuMega тебе поможет
                            берешь SoftIce или BoundsChecker
                            выставляешь Release c генерацией Debug Info
                            SoftIce=>Faults on ; i3here on; i1here on
                            loader32.exe=>Load=>Translate=>Run
                            усе Ж)
                              Ребята, а вы вообше читаете что человек спрашивает?
                              Вы помоему увлеклись
                                Ну да, увлеклись, а что?
                                Ему же уже ответили:
                                >VuDZ опубликован 27-12-2001 18:19 MSK
                                >-------------------------------------------->------------------------------------
                                >Может RSDN тебе поможет?
                                >тама кое чта есть по этому вопросу
                                Там и правда очень хорошая статья есть.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0390 ]   [ 16 queries used ]   [ Generated: 28.04.24, 04:47 GMT ]