Automatize o GDB: mostre backtrace a cada 10 ms
Pergunta
Eu quero escrever um script para o GDB, que salvará backtrace
(pilha) do processo a cada 10 ms. Como posso fazer isso?
Pode ser um smth, como o perfil de gráfico de chamadas para 'Penness' (para pessoas, que não podem usar nenhum tipo de perfil avançado).
Sim, existem muitos perfiladores avançados. Para CPUs populares e para oses populares. O tubarão é muito impressionante e fácil de usar, mas quero obter uma funcionalidade básica com esse script, trabalhando com o GDB.
Solução
Você pode pegar lsstack? Talvez você possa executar isso de um script fora do seu aplicativo. Por que 10ms? As porcentagens serão praticamente as mesmas em 100ms ou mais. Se o aplicativo for muito rápido, você poderá diminuí -lo artificialmente com um loop externo, e isso também não mudaria as porcentagens. Nesse sentido, você pode usar o CTRL-C para obter as amostras manualmente sob o GDB, se o aplicativo funcionar por tempo suficiente e se seu objetivo é descobrir onde estão os problemas de desempenho.
Outras dicas
(1) manual. Execute o seguinte em uma concha. Continue pressionando Ctrl+C repetidamente no prompt de shell.
gdb -x print_callstack.gdb -p pid
ou, (2) envie sinais para o PID repetidamente o mesmo número de vezes em outro shell, como no loop abaixo
let count=0; \
while [ $count -le 100 ]; do \
kill -INT pid ; sleep 0.10; \
let $count=$count+1; \
done
A fonte de print_callstack.gdb
De (1) está como abaixo:
set pagination 0
set $count = 0
while $count < 100
backtrace
continue
set $count = $count + 1
end
detach
quit
Página do homem do pstack https://linux.die.net/man/1/pstack
cat > gdb.run
set pagination 0
backtrace
continue
backtrace
continue
... as many more backtrace + continue's as needed
backtrace
continue
detach
quit
Obviamente, omitisse as linhas de newlines duplicadas, como você faz novas linhas únicas neste software de fórum? :(
gdb -x gdb.run -p $pid
Então basta usar do
kill -INT $pid ; sleep 0.01
em um loop em outro script.
kill -INT
é o que o sistema operacional faz quando você bate Ctrl-C. Exercício para o leitor: faça o script do GDB usar um loop com iterações de $ n.