Wie kann festgestellt werden, welche Anweisungen ein Prozess ausführt?

8

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.

Katzenhose
quelle
Ich bin ziemlich sicher, dass Sie Ihren Prozess in Ausführung mit gdboder debuggen können ddd. Auch in der Montage und ohne Debug-Symbole.
Valmiky Arquissandas
Siehe auch
Ciro Santilli 法轮功 病毒 审查 六四 事件 法轮功

Antworten:

10

Sie können dies mit gdb: Befehlen tun niund jeweils sieine einzelne Anweisung ausführen . Der Befehl nführt die nächste Codezeile für die meisten Werte von "next" aus. Für n(und die entsprechenden s) 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 gdbBefehl: display/i $pczeigt Ihnen die Anweisung, bevor sie ausgeführt wird. display $pcZeigen Sie die Codezeile an noder führen Sie ssie aus.

Bruce Ediger
quelle
Verwenden Sie gdb -p <pid>diese Option, um eine Verbindung zum Prozess herzustellen.
Ángel
6

Führen Sie ps -ldie Prozess-ID aus und überprüfen Sie die SSpalte ("Status"). Wenn der Status lautet R, führt Ihr Prozess Code aus. Wenn der Prozess im Status bleibt Rund stracenicht 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 bleibt D, 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 1234wo 1234die Prozess - ID. Mit dem Befehl skö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.

Gilles 'SO - hör auf böse zu sein'
quelle