Ich kenne strace und ltrace, aber das sagt mir nur, welche Systemaufrufe bzw. Bibliotheksaufrufe ein Prozess ausführt. Ich möchte genau wissen, welche Anweisungen ein Prozess ausführt. Entweder Montage oder eine Art Mittelweg zwischen C und Montage, wenn dies möglich ist. Angenommen, die Binärdatei wurde nicht mit Debug-Symbolen kompiliert, daher ist es wahrscheinlicher, dass Sie sich der ersten Option zuwenden.
Anwendungsfall: Der Prozess scheint hängen zu bleiben, keine Ausgabe von strace oder ltrace. Bestimmen Sie, ob der Prozess "etwas" tut. Mir ist klar, dass dies schwierig zu bestimmen sein könnte, da ich mir vorstelle, dass dies analog zur Lösung des Halteproblems ist. Es kann jedoch möglich sein, nützliche Daten zu sammeln.
Zweiter Anwendungsfall: Neugier. Es wäre interessant, die gesamte Liste der Montageanweisungen in eine Textliste zu kopieren.
Ich vermute, dass ich dazu gdb verwenden kann, bin mir aber nicht sicher, wie, da es weniger um das Debuggen eines von mir geschriebenen Programms als vielmehr um die Verwendung von gdb geht, um den Zustand eines laufenden Prozesses zu überprüfen.
Betriebssystem ist CentOS 6.
gdb
oder debuggen könnenddd
. Auch in der Montage und ohne Debug-Symbole.Antworten:
Sie können dies mit
gdb
: Befehlen tunni
und jeweilssi
eine einzelne Anweisung ausführen . Der Befehln
führt die nächste Codezeile für die meisten Werte von "next" aus. Fürn
(und die entsprechendens
) müssen Sie kompiliert haben, damit Debugging-Symbole in der ausführbaren Datei angezeigt werden.Diese Stackoverflow-Antwort bietet einige Methoden, um dies mehr oder weniger visuell zu tun.
Der
gdb
Befehl:display/i $pc
zeigt Ihnen die Anweisung, bevor sie ausgeführt wird.display $pc
Zeigen Sie die Codezeile ann
oder führen Sies
sie aus.quelle
gdb -p <pid>
diese Option, um eine Verbindung zum Prozess herzustellen.Führen Sie
ps -l
die Prozess-ID aus und überprüfen Sie dieS
Spalte ("Status"). Wenn der Status lautetR
, führt Ihr Prozess Code aus. Wenn der Prozess im Status bleibtR
undstrace
nicht anzeigt, dass er einen Systemaufruf ausführt, ist der Prozess in einer sehr langen, möglicherweise unendlichen Berechnung gefangen. Wenn der Prozess im Status ist und bleibtD
, wird er in einem Systemaufruf blockiert. Weitere Informationen zu Prozesszuständen finden Sie unter Was zeigt dieser Prozessstatus an? , Was zeigt der Zustand "unterbrechbarer Schlaf" an? und was ist, wenn 'kill -9' nicht funktioniert? .Wenn der Prozess eine lange Berechnung ausführt, können Sie Gdb (oder einen anderen Debugger) verwenden, um zu sehen, was er tut. Wenn der ausführbaren Datei Debugging-Informationen fehlen (was normalerweise der Fall ist, wenn Sie das Programm nicht speziell dafür kompiliert haben), kann der Debugger Ihnen nur Maschinenanweisungen anzeigen. Wenn die ausführbare Datei Debugging-Informationen enthält, können Sie die Namen der Funktionen in Stack-Traces usw. anzeigen. Zur Befestigung Gdb auf den Prozess, führt ,
gdb /path/to/executable 1234
wo1234
die Prozess - ID. Mit dem Befehls
können Sie Anweisungen einzeln ausführen. Wenn Sie kein Programmierer sind und nicht genau wissen, was das Programm tun soll, besteht in diesem Szenario kaum eine Chance, dass Sie nützliche Informationen von Gdb erhalten.quelle