2012-04-26 1 views
3

Мне очень нравится идея профилирования Flame Graph, так как это поможет устранить ненужные вызовы функций. Однако есть уловка в том, что он требует, чтобы профилировщик выполнял полный сброс стека каждый раз, когда он собирал образец. Это можно сделать с помощью DTrace или SystemTap довольно легко, но мне нужно сделать это на устройстве ARM, работающем на ubuntu (что исключает DTrace). Я также хотел бы сделать это без перекомпиляции ядра (что исключает SystemTap).Как получить полный сброс стека из профилировщика в каждом примере для использования в графе пламени?

Можно ли получить Valgrind/Callgrind или OProfile (или какой-либо другой инструмент профилирования, который может работать на ARM устройства в Ubuntu), чтобы что-то подобное:
dtrace -n 'profile-1001 /pid == 12345 && arg1/ { @[ustack()] = count(); }

+1

Возможности: * [pstack] (http://linuxcommand.org/man_pages/pstack1.html) * или профилировщик * [бедняк ] (http://poormansprofiler.org/) *, который использует gdb для получения следов стека. –

+0

pstack выглядит многообещающе, мне хотелось бы что-то более автоматизированное, чем профилировщик бедных. – Leo

+0

Проверьте наличие */proc//stack *. Это даст стек ядра для процесса. Что-то другое, но, возможно, полезно. Решение 'gdb' будет отслеживать только пространство пользователя *. То есть вы можете видеть, где ядро ​​тратит время от имени вашего процесса. Вероятно, вы должны удалить тег * dtrace * и добавить * linux *. –

ответ

6

Попробуйте Linux perf_events (так называемую команду «perf»), которая является частью ядра mainline Linux и обычно устанавливается через пакет linux-tools-common (или аналогичный). Я часто использую его для создания графиков пламени в Linux.

Я написал некоторые инструкции для создания графиков пламени с перфорацией на: http://www.brendangregg.com/perf.html#FlameGraphs

+0

+ Просто упрекнул вас, потому что никто не должен иметь низкую репутацию :) Я верю в образцы стека на стене, хотя вы можете знать, что я не волнуюсь о графах пламени. Приветствия. –

1

pstack предложил Майк Dunlavey, который к сожалению, segfaults после того, как я применил патч ARM и запустил его на ARM-устройстве. Пока у меня нет времени, чтобы взглянуть на него, я нашел следующее решение: затычка

http://www.commandlinefu.com/commands/view/4039/print-stack-trace-of-a-core-file-without-needing-to-enter-gdb-interactively

Он использует GDB с помощью следующей команды: gdb --q --n --ex bt --batch --pid PID

Немного медленно, но работает.