Option 1 wäre, den Quellcode der aufrufenden App zu ändern und tee
einzufügen in die Ausgabepipeline, um in diesem Stadium eine Kopie der Ausgabe zur Überprüfung zu erhalten.
Option 2 wäre, ein Wrapper-Skript um die betreffende ausführbare Datei zu schreiben. Ein schnelles Skript, das stdin und Argumente an die echte App weitergibt, dann die Ausgabe an einen Ort leitet, an dem Sie sie überprüfen können, und sie auch wieder ausspuckt, so wie die App nur ein paar Zeilen zum Aufpeppen sein sollte. Platzieren Sie es an einem speziellen Ort und fügen Sie diesen Ort vor Ihrer PATH-Variablen hinzu, und führen Sie dann Ihre Anwendung aus.
#!/bin/sh
cat - | /path/to/realapp [email protected] | tee /tmp/debug_output
Viele Informationen zu einem Programm erhalten Sie, indem Sie es unter strace
aufrufen . Dies zeigt jeden Systemaufruf, den das Programm durchführt, was manchmal zu viele Informationen sein kann, aber eine große Hilfe sein kann, um herauszufinden, was schief läuft.
Der erste Ansatz besteht darin, Ihre große Anwendung unter strace
auszuführen . Dies führt wahrscheinlich zu viel Ausgabe und verlangsamt Ihre Anwendung.
strace -s9999 -efile,process -f -o bigapp.strace bigapp
Wenn die große Anwendung interaktiv ist, ziehen Sie es vielleicht vor, sie zu starten und strace damit zu verbinden, sobald Sie bereit sind, die Berechnungen auszulösen. Notieren Sie sich die Prozess-ID der Anwendung, z. B. 12345, und führen Sie
ausstrace -s9999 -efile,process -f -o bigapp-calculations.strace -p12345
Wenn es ausreicht, diese externe ausführbare Datei zu beobachten, ersetzen Sie diese ausführbare Datei, wie andere Antworten bereits vorgeschlagen haben, durch ein Wrapper-Skript. Sie können die ausführbare Datei auf einen anderen Namen verschieben und das Wrapper-Skript an ihrer Stelle platzieren oder das Wrapper-Skript vor die übliche ausführbare Datei in PATH
stellen , oder konfigurieren Sie die Anwendung so, dass sie Ihr Wrapper-Skript anstelle der üblichen ausführbaren Datei aufruft, was auch immer praktisch ist. Erstellen Sie dieses Wrapper-Skript
#!/bin/sh
exec strace -s9999 -efile -o auxapp-$$.strace /path/to/original/executable "[email protected]"
Erläuterung der verwendeten Strace-Parameter:
-e
wählt die zu verfolgenden Systemaufrufe aus. Sie können Systemaufrufe nach Namen spezifizieren oder einige Kategorien wiefile
verwenden (open
,close
,read
,write
, …) undprocess
(fork
,execve
, …).-f
bewirkt, dass Strace Forks folgt, d. h. Unterprozesse sowie den ursprünglichen Prozess verfolgt.-o
wählt den Namen der Datei aus, die den Trace enthält.$$
ist ein Shell-Konstrukt, das für die Prozess-ID des Shell-Prozesses steht (aufgrund der Verwendung vonexec
im letzten Wrapper-Skript ist dies auch die Prozess-ID der Hilfsanwendung).-s9999
lässt es so viele Bytes fürread
anzeigen undwrite
und andere Anrufe.
Anstatt Ihren Pfad zu ändern, sollten Sie die Binärdatei, an der Sie interessiert sind, von „binary“ nach „binary.orig“ verschieben und dann durch ein Skript ersetzen. Sie sagten, Sie interessieren sich für die Argumente, also sollten Sie diese auch in eine Datei schreiben. Wahrscheinlich interessiert Sie auch die Ausgabe des Befehls "env". Es gibt alle derzeit aktiven Umgebungsvariablen aus. Umgebungsvariablen werden oft von einem Programm verwendet, um das Verhalten eines anderen Programms zu beeinflussen, das es aufruft.