Способы загнать липкую ошибку - PullRequest
3 голосов
/ 02 декабря 2009

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

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

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

Интересующее программное обеспечение работает на Linux, построенном с использованием gcc, в основном C ++, но может включать и другие языки, включая интерпретируемые, например. Python.

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

Ответы [ 3 ]

2 голосов
/ 02 декабря 2009

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

ДОБАВЛЕНО: Как отметил Дон Уэйкфилд, утилита pstack может быть идеальной для этой работы.

2 голосов
/ 02 декабря 2009

strace будет отслеживать системные вызовы. Это может дать некоторое представление о блокировке сетевых сокетов и т. Д.

1 голос
/ 03 декабря 2009

Можно получить трассировку стека работающей программы. В командной строке используйте «ps aux», чтобы найти PID программы. Предположим, что это 12345. Затем запустите:

gdb ---pid=12345

Когда программа застревает в паузе (или делает что-то подозрительное), выполните ctrl-C в gdb. Команда "bt" в gdb печатает стек, которым можно любоваться сейчас или вставить в текстовый файл для дальнейшего изучения. Возобновите выполнение программы с помощью «c» (продолжить).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...