@piva

Как отлаживать программы, которые долго выполняются?

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

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

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

Отсюда и вопрос. Не кто не знает о методах, приёмах, трюках для упрощения отладки программ, которые работают долго?
(повторюсь, что вопрос касается того случая когда уже нельзя сократить время работы)
  • Вопрос задан
  • 2555 просмотров
Пригласить эксперта
Ответы на вопрос 7
z17
@z17
Java, PHP
Сделайте чтобы программа писала в лог всё подряд во время выполнения.
Потом этот лог и читайте - будет видно где что-то пошло не так.
Ответ написан
Комментировать
gbg
@gbg Куратор тега Программирование
Любые ответы на любые вопросы
Формальное доказательство и подробное логирование с разверткой стека.
Чуть больше паранойи при написании кода - проверять все входные параметры методов и процедур на допустимость, проверять возврат у всех системных обращений. Так ошибка найдется раньше.
Размещайте константы везде, где только возможно.
Собирайте с -Wall и добивайтесь отсутствия предупреждений.
Ответ написан
Комментировать
@Mercury13
Программист на «си с крестами» и не только
1. Специальные условия выполнения. Например, у меня есть свой шаблон Array1d<>, в котором есть не только проверка диапазонов, но и т.н. «канарейка» — проверка, не испортила ли его случайно «сумасшедшая» подпрограмма. Все эти изыски включаются в параметрах компиляции.
2. Детальные логи ключевых объектов: что случилось и по какой причине.
3. Просто чутьё. Неинициализированную переменную на стеке я долго ловил: знал, где примерно ошибка, но любая диагностика (и даже перевод компилятора в debug) — стек смещается, и ищи ветра в поле. Включал проверку диапазонов, ту самую канарейку — ничего не даёт (ну естественно, никто и не пишет в «левую» память»). Много раз затыкал ошибку, но впоследствии я её как-то сумел продиагностировать, а дальше — дело техники.
Ответ написан
Комментировать
@Aios
Программист - Lite.
Как вариант за первый запуск соорудить некоторое окружение из переменных и параметров, дабы получить картину. Затем спрограммировать хук - допустим что бы эти самые параметры можно было передавать в "ошибочную область" извне. Таким образом вы увеличите вероятность того что сами отловите ошибку без содействия программы - и пока она будет работать вы будете перебирать параметры пока сама программа не отвалиться. Уж там и можно будет понять - по вашей вине это произошло или нет.
Ответ написан
Комментировать
Tyranron
@Tyranron
Еще можно писать тесты =)
Ответ написан
donkaban
@donkaban
Умею рисовать тени
Ждать. Если принять условие "ускорить процесс или эмулировать падение невозможно" - то включается максимальный уровень логирования, вставляются check-guard'ы везде, где только можно, коллстек пишется при любой ошибке (это несложно сделать изнутри, без дебагера). Все эксепшены обрабатываются в стиле - "это фатально, пишем колстек и вываливаемся". Ну и глазками по логам.

P.S. Всем, кто говорит, что нет ничего невозможного - у меня падал системный драйвер, причем причем ровно через 3 часа специфичной нагрузки. Не нормальный линуксовый, а блоб от производителя железки, ни о каких исходниках речи не шло. Около недели мы его обкладывали логами, везде, где только можно. Нашли. Но кровищи оно попило изрядно. Так что бывает так, что быстрее - не получится.
Ответ написан
Комментировать
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Вы точно используете конструкцию:
try {
//do something
} catch (e) {
//errors
}
;)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы