¿Puedo obtener la pila de llamadas python con el perf linux?
(3)
Por ejemplo,
def test():
print "test"
Utilicé el perf record -g -p $pid
, pero el resultado fue todo acerca de PyEval_EvalFrameEx
. ¿Cómo puedo obtener el nombre real "prueba" o si no puedo usar perf?
A partir de 2018, perf
simplemente no tiene soporte para leer los marcos de pila de Python (consulte una discusión de la lista de correo de Python de 2014 ).
Python 3.6 tiene algún soporte para Dtrace y Systemtap .
Una alternativa a esto es Pyflame, un perfilador estocástico para Python que muestra las pilas de llamadas de Python a través de ptrace()
. A diferencia de Dtrace / Systemtap, no necesita permisos adicionales y también funciona con versiones de Python compiladas sin soporte de instrumentalización.
Cuando usas la opción --threads con Pyflame, ves líneas de Python que llaman a las extensiones C / C ++, aunque el seguimiento de la pila se detiene en el último marco de Python. Pero quizás esto sea suficiente para su caso de uso.
No podrá hacer esto con perf, que está específicamente diseñado para interactuar con el modelo de proceso de Linux, decodificar esos marcos de pila, etc. Tendría que ampliarse con información específica de python para poder decodificar realmente la información de marco de Python, lo que no va a suceder. Desafortunadamente, no he encontrado una forma realmente buena de depurar fácilmente los módulos Python y C / C ++. Generalmente es pdb para uno y gdb para el otro.
Tal vez el módulo de traceback haga el truco por ti:
https://docs.python.org/2/library/traceback.html https://docs.python.org/3/library/traceback.html