Сбой программы при запуске вне IDE - PullRequest
2 голосов
/ 25 мая 2009

В настоящее время я работаю над программой C ++ в Windows XP, которая обрабатывает большие наборы данных. Наш самый большой входной файл вызывает неожиданное завершение работы программы без каких-либо сообщений об ошибках. Интересно, что когда программа запускается из нашей IDE (Code :: Blocks), файл обрабатывается без каких-либо проблем.

По мере обработки данных они помещаются в древовидную структуру. После того, как мы закончим наши вычисления, данные перемещаются в вектор C ++ STL перед отправкой для визуализации в OpenGL.

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

Мне интересно, возможно, размер набора данных приводит к проблемам при выделении пространства для вектора. Те системы, на которых я тестировал программу, теоретически должны иметь достаточно памяти для обработки данных (2 ГБ ОЗУ с набором данных, занимающим около 1 ГБ). Конечно, если память служит, векторы STL просто удваивают выделенное пространство при достижении своей емкости.

Спасибо, Эрик

Ответы [ 7 ]

9 голосов
/ 25 мая 2009

Тот факт, что код работает в среде IDE (предположительно, работает в отладчике?), Но не является автономным, подсказывает мне, что это может быть проблемой инициализации.

5 голосов
/ 25 мая 2009

Компилятор с уровнем предупреждения, установленным на макс.

Тогда проверь все свои предупреждения. Я предполагаю, что это неинициализированная переменная (которая в режиме отладки инициализируется значением NULL / 0).

Лично я настроил свои шаблоны так, чтобы предупреждения всегда были максимальными, а предупреждения помечались как ошибки, чтобы компиляция не удалась.

2 голосов
/ 25 мая 2009

Возможно, вам будет полезно настроить O / S для создания аварийного дампа (возможно, я не знаю, все еще с использованием некоторого системного программного обеспечения Windows под названием "Dr Watson"), к которому вы можете затем присоединить отладчик после сбоя программы (при условии, что - это сбой).

Вы также должны отследить различные способы, с помощью которых программа может завершить работу изящно без аварийного дампа: atexit, set_unexpected, set_terminate и, возможно, другие.

1 голос
/ 28 мая 2009

Как оказалось, наше оборудование достигает своего предела. Программа достигла предела системной памяти и потерпела неудачу. Мы даже не могли видеть создаваемые операторы ошибок, пока я не подключил cerr к файлу из командной строки (спасибо starko). Спасибо за все полезные предложения!

1 голос
/ 25 мая 2009

Как выглядит ваша модель памяти? Вы сталкиваетесь с пределом индекса (т.е. sizeof int)?

0 голосов
/ 26 мая 2009

Я бы рекомендовал попытаться приблизительно определить, какая строка вашего кода вызывает сбой.

Поскольку это происходит только вне вашей IDE, вы можете использовать OutputDebugString для вывода текущей позиции и использовать DebugView.

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

Недавно меня укусила ошибка синхронизации в моем коде, почему-то при отладке из IDE время всегда было хорошим, и ошибка не наблюдалась, но в режиме релиза bam ошибка была. Эта ошибка действительно PITA для отладки.

0 голосов
/ 26 мая 2009

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

Есть ли в древовидной структуре индексы, которые могли бы переполниться? Используете ли вы индексы в векторе, которые выходят за пределы текущего размера вектора?

new vector...    
vector.push_back()
vector.push_back()
vector[0] = xyz
vector[1] = abc
vector[2] = slsk // Uh,oh, outside vector

Насколько велик ваш самый большой входной набор? Вы заканчиваете тем, что выделяете элементы размера * размера? Если так, ваш самый большой набор входных данных больше 65536 элементов (65536 * 65536 == MAX_INT)?

Я согласен, что наиболее вероятная причина того, что среда IDE работает нормально, когда не работает автономная, заключается в том, что отладчик очищает память до 0 или использует средства защиты памяти вокруг выделенной памяти.

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

...