2009-08-06 14 views
3

Wie mache ich einen Valgrind memcheck für jede Instanz von Process, ohne sie über Valgrind-Befehlsoptionen zu starten.Wie kann ich memcheck für jede Instanz von Process valgrinden, ohne es über valgrind-Befehlsoptionen zu starten?

Gibt es eine Möglichkeit, die Überwachungsoptionen in einem Prozess zu speichern, anstatt den Prozess jedes Mal mit dem Befehl valgrind zu starten?

Wenn in Microsoft Application Verifier angegeben wird, dass eine Anwendung überwacht werden soll, wird eine beliebige Anzahl von Instanzen dieser Anwendung überwacht, unabhängig davon, ob es sich um einen untergeordneten Prozess handelt oder nicht.

Irgendwelche Ideen, um das gleiche in Valgrind zu tun?

Ich habe versucht --trace-children = yes Option von valgrind memcheck ... aber meine Anwendung xyz signalisiert eine andere Anwendung zzz, um eine neue intention von xyz (Prozess) zu starten, die ich analysieren möchte. In diesem Fall wird valgrind beendet, wenn xyz die Signalisierung zzz beendet. Es folgt nicht, auf welchem ​​Prozess zzz gestartet wurde.

Danke, Vijay

Antwort

4

IIRC, Valgrind muss die Anwendung ausgeführt werden, da es die Nur-Lese-Symbole verändert gemeinsame Bibliotheksfunktionen wie malloc und so weiter zu ersetzen.

Das bedeutet, dass Sie nicht können mechcheck an einen bereits laufenden Prozess anhängen, weil es diesen Abschnitt des Programms im Speicher nicht ändern kann (und es wahrscheinlich Laufstatus korrumpieren würde).

Es gibt wahrscheinlich auch andere Gründe. A quick google schlägt vor, dass Sie mechcheck nicht auch an einen laufenden Prozess anhängen können. Wie vorgeschlagen, können Sie Ihre ausführbaren Dateien in ein Bash-Skript wie z. Also, wenn Programm myprog neue Prozesse von newprog erstellt dann tun:

]$ mv /path/to/myprog /path/to/newprog 

dann

#!/bin/bash 
valgrind (options) /path/to/newprog [email protected] 

und nennen es myprog die [email protected] sorgt für Argumente übergeben werden. Wenn Ihr Programm dann einen neuen Prozess mit myprog -a b -c d erstellt, wird es in valgrind eingepackt.

Dies gilt nur für bestimmte C-Aufrufe wie execve() und andere, während andere obskure Möglichkeiten zum Erstellen von Prozessen möglicherweise nicht das Wrapping nutzen.

Wenn ich falsch bin, wäre es eine gute Sache sein, zu wissen :)

+0

Dank Aiden, das ist eine gute Idee. Ich werde versuchen, die ausführbare Datei zu umbrechen, um eine weitere Instanz des Prozesses mit Parametern zu erstellen, die wie vorgeschlagen übergeben werden und sehen, ob das hilft. Danke, Vijay –

2

Sie xyz entweder in einer Batch-Datei oder eine andere ausführbare wickeln kann, dass es innerhalb valgrind startet?

Mit anderen Worten, umbenennen xyz-run_me_under_valgrind, erstellen Sie eine neue xyz, die die ursprüngliche run_me_under_valgrind unter valgrind startet.

0

In Bezug auf Wrapper ausführbare Dateien, bin ich mit dem folgenden Skript für PostgreSQL gelandet. (Ich habe verschiedene Postgres-spezifische Teile wie die gefundene Valgrind-Unterdrückungsdatei ausgegrast).

#!/bin/bash 
set -e -u -x 

# Pop top two elements from path; the first is added by pg_regress 
# and the next is us. 
function join_by { local IFS="$1"; shift; echo "$*"; } 
IFS=':' read -r -a PATHA <<< "$PATH" 
export PATH=$(join_by ":" "${PATHA[@]:2}") 

NEXT_POSTGRES=$(which postgres) 
if [ "${NEXT_POSTGRES}" -ef "./valgrind/postgres" ]; then 
    echo "ERROR: attempt to execute self" 
    exit 1 
fi 

echo "Running ${NEXT_POSTGRES} under Valgrind" 

valgrind --leak-check=full --show-leak-kinds=definite,possible \ 
    --gen-suppressions=all --verbose --time-stamp=yes \ 
    --log-file=valgrind-$$-%p.log --trace-children=yes \ 
    --track-origins=yes --read-var-info=yes --malloc-fill=8f \ 
    --free-fill=9f --num-callers=30 postgres "[email protected]" 

Notiere die PATH Manipulation, um sicherzustellen, dass wir nicht versuchen, wieder postgres von der gleichen Stelle exec. In diesem Fall war es notwendig, dass das Wrapper-Skript auch genau postgres genannt wurde, also musste ich sicherstellen, dass es seins selbst nicht rekursiv ausführte.

Eine Alternative ist, whatis -a zu verwenden, um die nächste ausführbare Datei in dem Pfad zu finden, und es direkt auszuführen. Aber ich habe festgestellt, dass andere Probleme für meinen Anwendungsfall verursacht haben.


BTW, wenn Sie einen Fehler wie

valgrind: mmap(0x58000000, 2347008) failed in UME with error 22 (Invalid argument). 
    valgrind: this can be caused by executables with very large text, data or bss segments. 

bekommen ... dann ist es durchaus möglich, Sie versuchen valgrind unter valgrind versehentlich zu laufen.