Come determinare quali istruzioni sta eseguendo un processo?


8

Conosco strace e ltrace, ma questo mi dice solo quali chiamate di sistema e chiamate di libreria vengono eseguite rispettivamente da un processo. Vorrei sapere esattamente quali istruzioni sta eseguendo un processo. O assemblaggio o una sorta di via di mezzo tra C e assemblaggio, se possibile. Supponendo che il binario non sia stato compilato con simboli di debug, quindi inclinarsi verso la prima opzione come più probabile.

Caso d'uso: il processo sembra essere bloccato, nessun output da strace o ltrace. Determina se il processo sta facendo "qualcosa". Mi rendo conto che potrebbe essere difficile da determinare, poiché immagino che ciò sia analogo alla soluzione del problema di arresto. Tuttavia, potrebbe essere possibile raccogliere dati utili.

Secondo caso d'uso: curiosità. Sarebbe interessante scaricare l'intero elenco di istruzioni di assemblaggio in un elenco di testo.

La mia ipotesi è che posso usare gdb per fare questo, ma non so come, poiché si tratta meno del debug di un programma che ho scritto e di più sull'uso di gdb per verificare lo stato di un processo in esecuzione.

Il sistema operativo è CentOS 6.


Sono abbastanza certo che puoi eseguire il debug del tuo processo in esecuzione con gdbo ddd. Anche in assembly e senza simboli di debug.
Valmiky Arquissandas,

Risposte:


10

Puoi farlo con gdb: comandi nied siesegui una singola istruzione alla volta. Il comando nesegue la riga di codice successiva, per la maggior parte dei valori di "next". Per n(e il corrispondente s) devi aver compilato in modo che i simboli di debug compaiano nell'eseguibile.

Questa risposta StackOverflow offre un paio di metodi per farlo più o meno visivamente.

Il gdbcomando: display/i $pcmostra le istruzioni prima che vengano eseguite. display $pcmostra la riga di codice prima no la sesegue.


Utilizzare gdb -p <pid>per allegare al processo.
Ángel,

6

Esegui ps -ll'ID processo e controlla la Scolonna ("stato"). Se lo stato è R, il processo sta eseguendo il codice. Se il processo rimane nello stato Re stracenon mostra che sta eseguendo alcuna chiamata di sistema, il processo viene intrappolato in un calcolo molto lungo, forse infinito. Se il processo è e rimane nello stato D, viene bloccato in una chiamata di sistema. Per ulteriori informazioni sugli stati del processo, vedere Cosa indica questo processo STAT? , Che cosa indica lo stato di "sospensione interrompibile"? e cosa succede se 'kill -9' non funziona? .

Se il processo esegue un lungo calcolo, puoi usare Gdb (o un altro debugger) per vedere cosa sta facendo. Se l'eseguibile manca di informazioni di debug (che di solito è il caso se non si è compilato il programma appositamente per quello), allora il debugger sarà solo in grado di mostrarti le istruzioni della macchina; se l'eseguibile contiene informazioni di debug, sarai in grado di vedere i nomi delle funzioni nelle tracce dello stack e così via. Per collegare Gdb al processo, esegui gdb /path/to/executable 1234dove si 1234trova l'ID del processo. Il comando sconsente di eseguire le istruzioni una alla volta. A meno che tu non sia un programmatore e non abbia familiarità con ciò che il programma dovrebbe fare, ci sono poche possibilità che otterrai informazioni utili da Gdb in questo scenario.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.