2009-12-02 2 views
3

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

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

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

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

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

+0

На каком языке это? –

+0

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

ответ

1

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

gdb ---pid=12345 

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

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

+0

Я пробовал ctrl-C в ** gdb ** под Windows и не повезло. Кажется, он добирается до места, где нет реального стека. Интересно, что я делаю неправильно. –

+0

... Я причинил себе боль в xxx, объясняя снова и снова, почему эта техника работает так хорошо, например: http://stackoverflow.com/questions/406760/whats-your-most-controversial-programming -opinion/1562802 # 1562802 –

+0

... Этот пример показывает 40-кратное ускорение: http://stackoverflow.com/questions/926266/performance-optimization-strategies-of-last-resort/927773#927773 –

2

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

+0

Я использовал strace для программ, которые разбились. Это полезно для запуска, который я не хочу убивать? – DarenW

+1

Используйте strace для запуска приложения, он перехватит и запишет системные вызовы и вытолкнет их в stdout (или с -o в файл), Он будет работать до тех пор, пока вы его не прекратите (если вы используете программу, re running не сбой). Поэтому это должно быть хорошо для запуска, который вам не нужно убивать. –

2

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

ADDED: Как указал Дон Уэйкфилд, pstack утилита может быть идеально подходит для этой работы.

+1

И если вы работаете в Linux, вам даже не нужен отладчик. Просто используйте [pstack] (http://linux.die.net/man/1/pstack) –

+0

@ Don: Спасибо за подсказку. Кажется, он не показывает исходные строки, но он все еще выполняет свою работу. –

+1

Мужчина, я должен перестать жить в пещере! Не слышал об этом pstack до сих пор ... это может сделать эту работу. – DarenW

Смежные вопросы