Автоматизировать GDB: показывать обратную трассировку каждые 10 мс - PullRequest
3 голосов
/ 25 марта 2010

Я хочу написать скрипт для GDB, который будет сохранять backtrace (стек) процесса каждые 10 мс. Как я могу это сделать?

Это может быть что-то вроде профилирования графа вызовов для «без гроша» (для людей, которые не могут использовать какой-либо расширенный профилировщик).

Да, есть много продвинутых профилировщиков. Для популярных процессоров и для популярных ОС. Акула очень впечатляет и проста в использовании, но я хочу получить базовый функционал с таким скриптом, работающим с GDB.

Ответы [ 3 ]

3 голосов
/ 25 марта 2010

Можете ли вы получить lsstack ?Возможно, вы могли бы запустить это из скрипта за пределами вашего приложения.Почему 10мс?Проценты будут примерно одинаковыми при 100 мс и более.Если приложение слишком быстрое, вы можете искусственно замедлить его с помощью внешнего цикла, и это также не изменит процент.В этом отношении вы можете просто использовать Ctrl-C, чтобы вручную получить образцы в gdb, если приложение работает достаточно долго и ваша цель - выяснить, где проблемы с производительностью.

1 голос
/ 18 ноября 2015

(1) Руководство. Выполните следующее в оболочке. Продолжайте нажимать Ctrl + C несколько раз в командной строке.

gdb -x print_callstack.gdb -p pid

или, (2) отправлять сигналы pid несколько раз столько же раз на другой оболочке, что и в цикле ниже

let count=0; \
while [ $count -le 100 ]; do \
  kill -INT pid ; sleep 0.10; \
  let $count=$count+1; \
done

Источник print_callstack.gdb из (1) выглядит следующим образом:

set pagination 0
set $count = 0
while $count < 100
    backtrace
    continue
    set $count = $count + 1
end
detach
quit

справочная страница по pstack https://linux.die.net/man/1/pstack

0 голосов
/ 02 июня 2010
cat > gdb.run
set pagination 0 
backtrace 
continue 
backtrace 
continue 
... as many more backtrace + continue's as needed
backtrace 
continue 
detach 
quit

Конечно, пропустите дубликаты новой строки, как вы делаете отдельные строки в этом программном обеспечении форума? (

gdb -x gdb.run -p $pid

Тогда просто используйте do

kill -INT $pid ; sleep 0.01

в цикле в другом скрипте.

kill -INT - это то, что делает ОС, когда вы нажимаете ctrl-C . Упражнение для читателя: заставить скрипт gdb использовать цикл с $ n итерациями.

...