2010-03-25 1 views
3

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

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

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

+1

Вам лучше использовать Dtrace, если вы можете получить его для своей платформы. –

+0

У меня нет dtrace для платформы. У меня есть gdb для платформы. – osgx

ответ

3

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

+0

Я хочу автоматические периодические свалки. Для больших приложений, которые могут работать несколько минут. 10 мс для меня невозможно нажимать ctrl-c – osgx

+0

в ручном режиме, существует риск не получить стек из большинства горячих точек, если в приложении есть> 2-3 таких точки. – osgx

+0

Нет, я не могу получить lsstack. Я могу использовать gdb, и gdb имеет лучшие возможности в работе с моими приложениями. – osgx

0
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 

Тогда просто использовать делать

kill -INT $pid ; sleep 0.01 

в цикле в другом сценарии.

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

+0

, пожалуйста, никаких упражнений – osgx

1

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

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 
+0

альтернатива pstack или gstack –

+0

S R Bandi, можете ли вы добавить http ссылки на руководство (например, как обычный текст)? – osgx