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.
gdb
ouddd
. Même en assembleur, et sans symboles de débogage.Réponses:
Vous pouvez le faire avec les
gdb
commandes:ni
etsi
exécuter une seule instruction à la fois. La commanden
exécute la ligne de code suivante, pour la plupart des valeurs de "suivant". Pourn
(et le correspondants
), 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
gdb
commande:display/i $pc
vous montre l'instruction avant son exécution.display $pc
affiche la ligne de code avantn
ou l's
exécute.la source
gdb -p <pid>
pour attacher au processus.Exécutez
ps -l
sur l'ID de processus et vérifiez laS
colonne («état»). Si l'état estR
, alors votre processus exécute du code. Si le processus reste en étatR
etstrace
ne 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 étatD
, 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 1234
où1234
est l'ID du processus. La commandes
vous 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.la source