|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
13.02.2016, 19:53 | #1 |
Регистрация: 01.12.2008
Сообщений: 9
|
Вылет программы, НО исключительно в релизном .exe
Здравствуйте. Ситуация следующая (опишу всё детально, так что сообщение будет длинным):
C++, Visual Studio 2012, попытка написать свой консольный проект (в перспективе довольно сложный и уже довольно разветвлённый) с использованием ООП. Всё шло довольно неплохо, пока я не обнаружил баг, который меня просто в тупик поставил. Программа падает ТОЛЬКО после сборки exe в конфигурации Release. При отладке всё нормально, exe, собранный в конфигурации Debug, тоже работает как надо, но только не релизная версия. Консоль виснет спустя несколько секунд, затем классическое "Прекращена работа программы". Сделал лог-систему, определил конкретную проблему: вылет происходит в цикле при попытке выделить память именно для 10 элемента вектора. Участок кода покажу, но едва ли проблема конкретно в нём, т.к. я даже представить не могу, что в нём может быть неверно: Код:
Альтернативный код, который можно было бы использовать для тех же целей: Код:
Я даже раздобыл и добавил в проект самописную реализацию вектора, чтобы убедиться в конкретной причине ошибки: Код:
Что уже было сделано для исправления вылета: 1. try-catch Использовал следующую обёртку: Код:
2. Пытался воспроизвести ошибку в новом тестовом проекте, убрав абсолютно всё, что не относится непосредственно к проблемному участку кода, воссоздал все необходимые для него классы, сделав их практически пустыми. Ошибка не повторилась, что подтверждает идею о том, что проблема в том коде, который выполняется раньше. Проблема в том, что проект уже достаточно разветвлённый и лично для меня очень сложно постепенно добавлять к тестовому проекту код из оригинала, т.к. одно "цепляется" за другое и я без понятия, как это всё написать с неполным функционалом, но так, чтобы воспроизвести ошибку. 3. Прочёл статью "Как пережить release-версию", понял не слишком много, но некоторые приёмы оттуда применил. В частности - проинициализировал все переменные в соответствующих конструкторах и полностью отключил оптимизацию в release-конфигурации. Ни то, ни другое, как вы понимаете, не помогло. Что ещё сделать - не знаю. Понимаю, что никому это нафиг не сдалось, но приложу на всякий случай весь проект. Предупреждаю - там адовый быдлокод, ужасная архитектура и комментарии почти отсутствуют, но вдруг кому-нибудь захочется в этом разобраться. Но вообще, это так, надежда на халяву. По делу вопросы такие - что ещё можно сделать, по какой причине эта ошибка может возникать, учитывая всё вышенаписанное (а то у меня лишь догадки), и какие ещё средства отладки для релизного exe можно применить, чтобы разобраться в проблеме? Благодарю за потраченное время. |
13.02.2016, 20:39 | #2 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
Вы выходите за пределы выделенного блока.
В дебаге это катит, потому что перед и после каждым блоком есть контрольные куски. В релизном варианте их нет и вы портите соседний блок, ну и далее по списку. Вот ваша проблема: int width = wcslen(str); text = new wchar_t[width]; wcscpy(text, str); Совет: Никогда, никогда, НИКОГДА не работайте с указателями напрямую. |
13.02.2016, 21:15 | #3 |
Регистрация: 01.12.2008
Сообщений: 9
|
Чёрт, спасибо. Чувствую себя идиотом - я не понимаю, почему я считал, что завершающий символ включается в возвращаемое wcslen значение, ведь в документации написано обратное. К тому же, я же ведь вообще закомментировал когда-то весь этот участок кода и каким-то образом получил вылет, поэтому был уверен, что это тут ни при чём.
Всего-то int width = wcslen(str) + 1; и всё заработало. Но совет ваш я приму к сведению. Спасибо огромное. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Вылет программы при использовании макроса | SaLoKiN | Microsoft Office Excel | 102 | 03.12.2013 07:07 |
Windows запускается исключительно с флэшки. | Михаил Урвилов | Операционные системы общие вопросы | 1 | 25.05.2012 20:08 |
вылет программы при выводе простого числа (cout) | Ciberal | Общие вопросы C/C++ | 7 | 27.09.2011 01:51 |
Вылет программы после завершение | kloffelin | Общие вопросы C/C++ | 3 | 17.04.2010 20:18 |
Из программы 1.exe создаем пустой файл 2.exe. Как из программы 1 внести API функции в программу 2? | X-LEV-X | Общие вопросы Delphi | 7 | 09.03.2010 08:33 |