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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top