Comment déterminer quelles instructions un processus exécute?

8

Je connais strace et ltrace, mais cela ne me dit que les appels système et les appels de bibliothèque qu'un processus exécute, respectivement. Je voudrais savoir exactement quelles instructions un processus exécute. Soit l'assemblage, soit une sorte de compromis entre C et l'assemblage si cela est possible. En supposant que le binaire n'a pas été compilé avec des symboles de débogage, il est donc plus probable de se pencher vers la première option.

Cas d'utilisation: le processus semble être bloqué, aucune sortie de strace ou ltrace. Déterminez si le processus fait «quelque chose». Je me rends compte que cela pourrait être difficile à déterminer, car j'imagine que cela est analogue à la résolution du problème d'arrêt. Cependant, il pourrait être possible de recueillir des données utiles.

Deuxième cas d'utilisation: la curiosité. Il serait intéressant de vider la liste complète des instructions d'assemblage dans une liste de textes.

Je suppose que je peux utiliser gdb pour ce faire, mais je ne sais pas comment, car il s'agit moins de déboguer un programme que j'ai écrit et plus d'utiliser gdb pour vérifier la santé d'un processus en cours d'exécution.

Le système d'exploitation est CentOS 6.

pantalon de chat
la source
Je suis assez certain que vous pouvez déboguer votre processus en cours d'exécution avec gdbou ddd. Même en assembleur, et sans symboles de débogage.
Valmiky Arquissandas
Connexe: stackoverflow.com/questions/2971926/…
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

Réponses:

10

Vous pouvez le faire avec les gdbcommandes: niet siexécuter une seule instruction à la fois. La commande nexécute la ligne de code suivante, pour la plupart des valeurs de "suivant". Pour n(et le correspondant s), vous devez avoir compilé afin que les symboles de débogage apparaissent dans l'exécutable.

Cette réponse stackoverflow donne quelques méthodes pour le faire plus ou moins visuellement.

La gdbcommande: display/i $pcvous montre l'instruction avant son exécution. display $pcaffiche la ligne de code avant nou l' sexécute.

Bruce Ediger
la source
Utilisez gdb -p <pid>pour attacher au processus.
Ángel
6

Exécutez ps -lsur l'ID de processus et vérifiez la Scolonne («état»). Si l'état est R, alors votre processus exécute du code. Si le processus reste en état Ret stracene montre pas qu'il exécute un appel système, alors le processus est piégé dans un calcul très long, peut-être infini. Si le processus est et reste en état D, il est bloqué lors d'un appel système. Pour plus d'informations sur les états de processus, voir Qu'est-ce que ce processus indique STAT? , Qu'est-ce que l'état de "sommeil interruptible" indique? et si « kill -9 » ne fonctionne pas? .

Si le processus exécute un long calcul, vous pouvez utiliser Gdb (ou un autre débogueur) pour voir ce qu'il fait. Si l'exécutable manque d'informations de débogage (ce qui est généralement le cas si vous n'avez pas compilé le programme spécialement pour cela), le débogueur ne pourra que vous montrer les instructions de la machine; si l'exécutable contient des informations de débogage, vous pourrez voir les noms des fonctions dans les traces de pile et ainsi de suite. Pour attacher Gdb au processus, exécutez gdb /path/to/executable 12341234est l'ID du processus. La commande svous permet d'exécuter des instructions une par une. À moins que vous ne soyez un programmeur et que vous soyez quelque peu familier avec ce que le programme est censé faire, il y a peu de chances que vous obteniez des informations utiles de Gdb dans ce scénario.

Gilles 'SO- arrête d'être méchant'
la source