¿Cómo determinar qué instrucciones está ejecutando un proceso?

8

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.

pantalones de gato
fuente
Estoy bastante seguro de que puede depurar su proceso en ejecución con gdbo ddd. Incluso en ensamblaje, y sin símbolos de depuración.
Valmiky Arquissandas
Relacionado: stackoverflow.com/questions/2971926/…
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

Respuestas:

10

Puede hacer esto con gdb: comandos niy siejecutar una sola instrucción a la vez. El comando nejecuta la siguiente línea de código, para la mayoría de los valores de "siguiente". Para n(y el correspondiente s) 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 gdbcomando: le display/i $pcmuestra las instrucciones antes de que se ejecute. display $pcmuestra la línea de código antes no la sejecuta.

Bruce Ediger
fuente
Use gdb -p <pid>para adjuntar al proceso.
Ángel
6

Ejecute ps -lla ID del proceso y verifique la Scolumna ("estado"). Si el estado es R, entonces su proceso está ejecutando código. Si el proceso permanece en estado Ry straceno 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 estado D, 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 1234donde 1234está la ID del proceso. El comando le spermite 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.

Gilles 'SO- deja de ser malvado'
fuente