Ich schrieb eine PHP-Erweiterung für den Zugriff auf Funktionen in einer statischen Bibliothek, ich baute PHP als CGI, und alles schien zu funktionieren (nach einigen Tagen der Arbeit daran ..)
Begeistert, sobald alles geklappt hat, habe ich PHP kompiliert, ohne die Nachrichten zu debuggen, die ich darin hatte. ( php_printf("here111");
.... php_printf("sending arguments...");
)
Dann hat es einfach aufgehört zu arbeiten. Die Funktion, die ich in der statischen lib aufruft, funktioniert, ich habe es getestet, indem ich sie direkt von einer anderen ausführbaren Datei aufgerufen habe.
Ich habe PHP mit Debugging-Symbolen ( --enable-debug
) gebaut und kann es bis zu einem gewissen Grad in gdb debuggen.
Ich kämpfe immer noch um herauszufinden, was los ist. Es scheint, dass die Funktion in der lib ( diffFst
) die Eingabeargumente scheinbar nicht lesen kann.
Wenn ich diese Funktion aufrufe, arbeitet die php_printf()
-Anweisung und gibt die richtigen Werte aus. Wenn ich jedoch die Funktion difffst_ aufrufen lasse, bekomme ich einen segfault, wenn ich versuche, die Eingabevariablen zu lesen.
Die diffFst-Funktion wird in fortran geschrieben:
%Vor% Insbesondere schlägt es bei Zeile 122 (entsprechend dem Debugger) fehl, wenn es versucht, filA
zu lesen.
Ich habe keine Ahnung warum, ich habe es versucht:
ier = ..
) return
-Anweisungen im Code und entfernen Sie die return
-Anweisungen Es scheint nur so, als ob die Daten nicht richtig übergeben werden. Selbst im Debugger kann ich die Argumente nicht lesen.
Das Frustrierende ist, dass es irgendwann funktioniert hat. Ich habe Dateiberechtigungen überprüft, Pfade überprüft usw. Und ich kann die Funktion von einer Fortran-Wrapper ausführbar ausführen, einfach.
Gibt es einen Trick, den ich vermisse?
Danke
Es dauerte eine Weile und benötigte zusätzliche Hilfe ( Probleme wie das )
Grundsätzlich mussten sich zwei Dinge ändern:
Der erste ist einfach, einfach ier=func(..., &integer_var, ...)
Die zweite bestand darin, die Länge der Zeichenfolge zu übergeben. Möglicherweise gab es einen einfacheren Weg, dies zu tun (Stringlänge durch Suchen nach dem \ 0), aber sie haben nicht geklappt. So, jetzt passiere ich
%Vor%Dann akzeptiere ich in Fortran die Zeichenfolge als
%Vor%Die spezifischen Änderungen des obigen Fortran-Codes sind
%Vor% Als es funktionierte, musste es gewesen sein, bevor ich versuchte, die Zeichenfolgen als (len=*)
einzulesen, und ganze Zahlen wurden als Referenzen übergeben, so dass sie im Wesentlichen zufällige Werte hatten.
Danke für alles andere!
Ihr Programm scheint den Stapel zu zerstören. Stack-Korruption kommt normalerweise mit einer falschen Verwendung von Zeigern. Überprüfen Sie sorgfältig (untersuchen Sie den Inhalt von Variablen mithilfe von Debugger oder einfachen Footprints) direkt vor verdächtigen Funktionsaufrufen.
Tags und Links c php segmentation-fault php-internals php-extension