2016-05-01 15 views
1

Ich habe zwei Programme: A und B. Sie sind verschiedene Programme, B ist keine Gabel von A. A startet B. Frage: Kann ich den Fehler der Segmentierung von B von A zurückbekommen? Ich kann Quellcode von B Programm nicht ändern.Get segfault backtrace des untergeordneten Prozesses

+1

definitiv kommuniziert Sie können. Ein üblicher Weg, dies zu erreichen, besteht darin, Coredumps zu aktivieren, die postmortale Momentaufnahmen eines Prozesses enthalten. Die Frage ist, ob das für Sie erschwinglich ist ... – user3159253

Antwort

1

Sie sind verschiedene Programme, B ist nicht eine Gabel von A. A startet B

Mit "Start", ich nehme an, Sie bedeuten, dass A ein fork tut und das Kind tut execvp von B

Ich kann Quellcode von B Programm nicht ändern.

Dies bedeutet, dass Sie die Quelle B haben , können aber es nicht ändern, aber es mit -g, -O0 und anderen Dingen wie -fno-omit-frame-pointer zu bekommen Debugging-Symbole und eine bessere Chance, neu kompilieren könnte bei eine genauere Stapelverfolgung.

jedoch ein anderer Weg, dies zu interpretieren ist, dass Sie nur B als ausführbare Binärdatei haben und tun nicht Quellcode für sie.

Ich folge auch, dass Sie haben Quelle für A [und können tun, was notwendig ist, um die Dinge funktionieren].

Frage: kann ich zurücktrace der segmentation fehler von B von A?

Ja. Es gibt ein paar verschiedene Möglichkeiten.

A kann ptrace verwenden, wenn B wie gdb oder strace Aufruf tun würde. Wenn B segfaults, kann A Steuerung erhalten und den Stapel zurückgehen und es ausdrucken.

Aber das wirft die Frage auf: Ist Ihr primäres Ziel, [nur] zu debuggen B? Es könnte einfacher sein, A eine fork/exec von gdb B anstelle von nur B zu tun, so dass gdb kann das "schwere Heben" als Stack-Traceback ist eine einfache gdb Befehl. Der noch einfachere Weg besteht darin, B zu erlauben, Core zu entladen, indem das Limit in einem Shell-Kommando aktiviert wird und die Core-Datei danach mit gdb untersucht wird.

Eine weitere mögliche Option. Sehen Sie sich die Symbole in B mit readelf und die Liste der benötigten gemeinsamen Bibliotheken über ldd an. Sie können dann entscheiden, ob B irgendwelche "Haken" -Punkte hat. Das heißt, alle Symbole, die von einer gemeinsam genutzten Bibliothek wie open aufgerufen werden sollen.

Sie können eine spezielle gemeinsame Bibliothek mit open darin erstellen, dann "erzwingen" sie auf B, indem Sie die Umgebungsvariable LD_PRELOAD setzen. Wenn dann Bopen aufruft, erhält Ihre gemeinsam genutzte Bibliothek die Kontrolle. Sie können dann einen Signalhandler für SIGSEGV installieren und dann mit dlsym die Adresse des "echten" öffnen und den open Aufruf beenden.

Jetzt, wenn B segfaults, kann der Signalhandler in Ihrer speziellen gemeinsam genutzten Bibliothek den Stapel über __builtin_return_address et zurückgehen. al. und kommunizieren die Ergebnisse zurück an A (über eine Leitung oder Buchse)

Noch ein anderer Weg ist es, die B ausführbar zerhacken und fügen Sie einen Haken, der Art und Weise, die mit A

+0

Ich habe 'B' als binäre ausführbare Datei. 'A' ist ein Programm, das automatisch andere Programme testet, die von den Teilnehmern der Olympischen Spiele programmiert werden. Vielen Dank! Ich werde alle vorgeschlagenen Lösungen ausprobieren. – melihovv

Verwandte Themen