Автор
|
Тема: Поиск ошибок в Release версии
|
Kir1 |
опубликован 27-12-2001 14:05 MSK
Как осуществлять поиск ошибок в программе написанной на Visual C++ с MFC? Как я себе это представляю, то необходимо отлавливать все исключения сгенерированные программой и распечатываеть в файл содержимое стека... Чтобы по этой распечатке найти потом место в котором собственно и произошел вылет...Есть ли в MFC механизмы для этого? Функция AfxDumpStack() замечательно работает, но только в отладочной версии, а почему не работает в релизе? Подскажите, плз...
|
Kir1
|
опубликован 27-12-2001 17:25 MSK
Неужели никто не сталкивался с такой проблемой? Или я плохо сформулировал свой вопрос? |
VuDZ
|
опубликован 27-12-2001 18:19 MSK
Может RSDN тебе поможет? тама кое чта есть по этому вопросу |
ADK
|
опубликован 28-12-2001 08:07 MSK
По-моему, лучше всего протестировать нормально в DEBUG с BoundsChecker. А содержимое стека тебе и так пришлют, когда грохнется :-)). |
the_moon
|
опубликован 28-12-2001 10:23 MSK
В релизном варианте, при компиляции и линковке не включается отладочная информация, ну там привязка к исходникам, имена функций, номера строк итп., потому AfxDumpStack не имеет достаточно инфы для работы.Тупой вариант зделать свой стэк, правда тебе придется каждое тело функции заворачивать в try - catch и забыть про return, вообщем гигантская работа, нужна только в больших проэектах, нормально осущевствима только на Си++, и должна быть продумана с самого начала. Другой, нереальный вариант, не делать ошибок :) Или если доверяешь клиентам пошли отладочную версию. И все дела. успехов |
tonik
|
опубликован 10-01-2001 05:45 MSK
Так а зачем искать ошибки в Release-версии? Разве отладочная версия не для этого существует? |
eyes
|
опубликован 10-01-2001 09:11 MSK
2tonik: простой пример - int i; в отладочной версии инициализируется нулем, а в релизе - не инициализируется вообще (будет содержать случайное значение). И таких различий очень много. |
vitya
|
опубликован 10-01-2001 11:58 MSK
У меня например дебуг версия нормально пахала, а в релизе был редкий exception на уровне системы, я его так и не сумел отловить, вопрос там был в multithreading-е когда запускался второй thread прога давала exception и все. |
tonik
|
опубликован 14-01-2001 04:42 MSK
2eyes Так лучше самому инициализировать переменную. И разве компилер не выдаст предупреждения при использовании переменной до инициализации? |
Kasya
|
опубликован 14-01-2001 05:48 MSK
2tonik: Все мы люди, иногда можно чего-нибудь несущественного не заметить, а компилятор невсегда выдает предупреждения когда надо, а иногда делает это когда не надо. У меня тоже были случаи когда дебаг работал нормально а релиз вызывал милое сообщение - "программа выполнила недопустимую операцию" |
eyes
|
опубликован 15-01-2001 15:33 MSK
В Яве компилер это делает (предупреждает).Пример: int i; if (some) { i = 123; } int d = i - 321; // если some == FALSE, имеем грабли. Для этого в компилере надо анализировать все возможные пути исполнения кода, что в Си значительно труднее сделать.
|
Kir1
|
опубликован 17-01-2001 12:06 MSK
К вопросу о том зачем это нужно, мне кажется риторический вопрос, тк как бы вы не тестировали программу, всё равно будут ошибки, причем, всем известная истина (пардон), чем больше программа, тем больше ошибок в ней будет... В борланде у себя в конторе мы решали это следующим образом: 1. при создании релиза, сохраняли для этого релиза у себя файл с отладочной информацией 2. в программе реализовывалась функция печати содержимого стека в файл 3. при всех вылетах вызывалась эта функция По-моему механизм очень не плохой, тк в случае вылета клиент мог прислать нам файл с ошибкой, мы сопоставляем его с файлом отладочной инфы для этого релиза и получаем название модулей, функций и номера строк, таким образом можно локализовать ошибку, вот я и подумал, что, может быть, есть какие-то подобные стандартные механизмы в том же MFC ? Посоветуйте, подскажите, буду очень благодарен... |
x
|
опубликован 17-01-2001 13:21 MSK
NuMega тебе поможетберешь SoftIce или BoundsChecker выставляешь Release c генерацией Debug Info SoftIce=>Faults on ; i3here on; i1here on loader32.exe=>Load=>Translate=>Run усе Ж) |
Belchik
|
опубликован 17-01-2001 13:57 MSK
Ребята, а вы вообше читаете что человек спрашивает? Вы помоему увлеклись |
eyes
|
опубликован 17-01-2001 15:13 MSK
Ну да, увлеклись, а что? Ему же уже ответили:>VuDZ опубликован 27-12-2001 18:19 MSK >-------------------------------------------->------------------------------------ >Может RSDN тебе поможет? >тама кое чта есть по этому вопросу Там и правда очень хорошая статья есть. |
Kir1
|
опубликован 17-01-2001 16:34 MSK
Там есть 2 статьи: 1. Диагностические средств MFC 2. Как пережить release версию Я же спрашивал, про обнаружение ошибок после выпуска release программы. Вам когда-нибудь IE выдавал сообщение с вопросом отправить ли ошибку в Microsoft, они же её разбирают как-то... В общем я так понял, что стандартного ничего нету... Спасибо всем кто принял участие в обсуждении этой темы... |
eyes
|
опубликован 21-01-2001 18:06 MSK
По-моему в Ultimate Toolbox было что-то подобное... (я просто в вопрос не въехал без последнего объяснения...)Делаем макрос MYASSERT: в отладочной версии работает как стандартный ASSERT, в релизе - пишет что-то... типа как второй параметр можно указать при вызове макро... ......... в бете можно вывести окошко для отправки мыла разработчикам |