SEG Fehler in der PHP-Erweiterung

8

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.

%Vor%

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:

  • Die Funktion zu einer Subroutine machen
  • Die Funktion zu einer Fortran-Funktion machen
  • Die Funktion zu einer "reinen" Funktion machen
  • Rückgabewerte (das ist es, was es jetzt gibt, ier = .. )
  • Haben Sie return -Anweisungen im Code und entfernen Sie die return -Anweisungen
  • Versucht, Dinge auszudrucken und Dateien zu protokollieren

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

    
Matt 02.01.2013, 15:36
quelle

2 Antworten

2

Es dauerte eine Weile und benötigte zusätzliche Hilfe ( Probleme wie das )

Grundsätzlich mussten sich zwei Dinge ändern:

  • Übergeben Sie Ganzzahlen als Referenz
  • Akzeptiere Zeichenfolgen richtig

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!

    
Matt 03.01.2013, 04:57
quelle
1

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.

    
OlegG 08.01.2013 15:11
quelle