Sé acerca de strace y ltrace, pero eso solo me dice qué llamadas al sistema y llamadas a la biblioteca está ejecutando un proceso, respectivamente. Me gustaría saber exactamente qué instrucciones está ejecutando un proceso. Ya sea ensamblaje, o algún tipo de punto medio entre C y ensamblaje si eso es posible. Suponiendo que el binario no se ha compilado con símbolos de depuración, es más probable que se inclinen hacia la primera opción.
Caso de uso: el proceso parece estar bloqueado, sin salida de strace o ltrace. Determine si el proceso está haciendo "algo". Me doy cuenta de que esto puede ser difícil de determinar, ya que imagino que esto es análogo a la solución del problema de detención. Sin embargo, podría ser posible recopilar datos útiles.
Segundo caso de uso: curiosidad. Sería interesante volcar la lista completa de instrucciones de ensamblaje en una lista de texto.
Supongo que puedo usar gdb para hacer esto, pero no estoy seguro de cómo hacerlo, ya que se trata menos de depurar un programa que he escrito y más sobre usar gdb para verificar el estado de un proceso en ejecución.
El sistema operativo es CentOS 6.
gdb
oddd
. Incluso en ensamblaje, y sin símbolos de depuración.Respuestas:
Puede hacer esto con
gdb
: comandosni
ysi
ejecutar una sola instrucción a la vez. El comandon
ejecuta la siguiente línea de código, para la mayoría de los valores de "siguiente". Paran
(y el correspondientes
) debe haber compilado para que los símbolos de depuración aparezcan en el ejecutable.Esta respuesta de stackoverflow proporciona un par de métodos para hacer esto más o menos visualmente.
El
gdb
comando: ledisplay/i $pc
muestra las instrucciones antes de que se ejecute.display $pc
muestra la línea de código antesn
o las
ejecuta.fuente
gdb -p <pid>
para adjuntar al proceso.Ejecute
ps -l
la ID del proceso y verifique laS
columna ("estado"). Si el estado esR
, entonces su proceso está ejecutando código. Si el proceso permanece en estadoR
ystrace
no muestra que ejecuta ninguna llamada del sistema, entonces el proceso queda atrapado en un cálculo muy largo, posiblemente infinito. Si el proceso está y permanece en estadoD
, se bloquea en una llamada al sistema. Para obtener más información sobre los estados del proceso, consulte ¿Qué indica este proceso STAT? , ¿Qué indica el estado de "suspensión interrumpible"? y ¿Qué pasa si 'kill -9' no funciona? .Si el proceso ejecuta un cálculo largo, puede usar Gdb (u otro depurador) para ver qué está haciendo. Si el ejecutable carece de información de depuración (que suele ser el caso si no compiló el programa especialmente para eso), entonces el depurador solo podrá mostrarle las instrucciones de la máquina; si el ejecutable contiene información de depuración, podrá ver los nombres de las funciones en los seguimientos de la pila, etc. Para adjuntar Gdb al proceso, ejecute
gdb /path/to/executable 1234
donde1234
está la ID del proceso. El comando les
permite ejecutar instrucciones una a la vez. A menos que sea un programador y esté algo familiarizado con lo que se supone que debe hacer el programa, hay pocas posibilidades de que obtenga información útil de Gdb en este escenario.fuente