Трассировка стека работающего приложения UNIX - PullRequest
3 голосов
/ 01 августа 2011

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

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

Ответы [ 5 ]

2 голосов
/ 01 августа 2011

Как выполнить трассировку в режиме реального времени на работающем приложении UNIX

gcore можно использовать для захвата файла ядра для живого процесса. Это даст вам снимок трассировки стека для всех потоков. Однако такой подход может оказаться слишком тяжелым для ваших нужд.

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

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

2 голосов
/ 01 августа 2011

Инструменты профилирования покажут, какие биты программы занимают процессорное время.Если вам нужно копать глубже, вам могут понадобиться другие инструменты.В зависимости от того, какой тип Unix вам нужен, инструменты могут отличаться, поскольку это иногда зависит от конкретной платформы. В этой статье обсуждается мониторинг процессов в Linux.Разные версии unix могут иметь разные наборы утилит для функций, которые должны взаимодействовать с ядром (например, Dtrace для Solaris).Некоторые работают на разных платформах.

2 голосов
/ 01 августа 2011

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

0 голосов
/ 01 августа 2011

Ваш отладчик может иметь функциональность для подключения к работающему процессу.С gdb это выглядит как

$ gdb path/to/exec 1234

, где 1234 - PID запущенного процесса.

(Но рассмотрим те ответы, которые направляют вас к утилите профилирования.)

0 голосов
/ 01 августа 2011

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

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