LINUX.ORG.RU

Как в проекте на c++ найти бесконечный цикл


0

0

Здравствуйте.

Имеется чужой большой проект на c++, при определенных (непонятных) условиях зависает, т.е. не валится, а впадает в бесконечный цикл. Как можно найти этот цикл? Пошагово отладить возможности нет - это сложный сервер, ошибка только под нагрузкой. В каждый цикл вписать отладочный ввод - тоже займет чертовски много времени - исходников очень много. Может с помощью gdb? Но как? Или может под профайлером запустить?

мне когда-то очень помогло
#define for(a) ...
#define while(a) ...
и туда вызов smart функций подсчитывающей количество ее вызовов с каждой точки за секунду(точка по __LINE__ идентифицировалась, но можно %eip использовать)
Советую копать в эту сторону
Хотя gprof думаю тоже может неплохо помочь.
С уважением, Rilium aka Климентов Константин Сергеевич.

anonymous
()

Запустить под GDB, а когда зависнет - остановить и смотреть где зависло?

alexru ★★★★
()

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

anonymous
()

Вообщем так: под GDB эта штука махом сегфолтится. Если к существующему процессу подоседенится - тоже падает махом. Ещё и многопоточная.

Может ещё чем, кроме GDB можно попробовать?

Barlog_M
() автор топика
Ответ на: комментарий от anonymous

> может ABRT послать и полученную корку под гдб глянуть?

Воот, уже интересней - попробуем. :)

Barlog_M
() автор топика

Когда зависнет - убей его кошерно и вскрой корку.

anonymous
()
Ответ на: комментарий от Barlog_M

> Вообщем так: под GDB эта штука махом сегфолтится. Если к существующему процессу подоседенится - тоже падает махом. Ещё и многопоточная.

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

> Может ещё чем, кроме GDB можно попробовать?

Раз сегфолтится - значит, блин, надо исправлять, а не искать костыли!

anonymous
()
Ответ на: комментарий от Barlog_M

> Может ещё чем, кроме GDB можно попробовать?

Можно попробовать сделать какую-нить утилиту на базе valgrind или pin которая сохраняет адреса всех ветвлений, в таком свете бесконечный цикл точно должно быть видно.

Dima_Ky
()
Ответ на: комментарий от Barlog_M

Если понимаешь структуру этой софтины, а вариант с разбором коры тебе почему-то не нравится, можешь натыкать checkpoint'ов _на_самом_верхнем_уровне_, скажем, в виде fprintf(logfile, "функция 1: вход\n"), fprintf(logfile, "функция 1: прошли точку 1"), fprintf(logfile, "функция 1: выход\n") (если боишься многопоточности, делай каждый раз fopen(filename, "a")/fclose(). Потом посчитать число входов и выходов. Если входов больше, чем выходов, тыкай уточняющие точки. Итераций за 10 доберёшься до проблемы. При некоторой сноровке и везении можно за пару часов разобраться.

Другой вариант - разобраться для начала, почему она падает под отладчиком, и починить это. Но про это не знаю.

alexsaa
()

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

Barlog_M
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.