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
Antwort
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 B
open
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
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
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