Komilierung mit der -pg Option: Das Programm stürzt ab



  • Hallo, Leute. Ich wollte heute mein Programm profilen. Dazu habe ich es auf Linux mit der -pg Option kompiliert. Nachdem ich es aber gestartet habe, produzierte es einen Fehler, und wurde von meiner Abfangroutine heruntergefahren. Im Programm lese ich von mehreren File Descriptoren, in einer Schleife. Der Fehler wurde von dem Block

    if (select(FD_SETSIZE, &inputDescriptors, NULL, NULL, NULL) == -1)
    {
    	syslog(LOG_EMERG, "Could not access the channel selection! Aborting...");
    	return EXIT_FAILURE;
    }
    

    produziert. Der select-Befehl hat eine -1 zurückgegeben.

    Nun, das Interessante ist, dass der Fehler nur dann produziert wird, wenn das Programm mit der -pg Option kompiliert wurde. Sonst läuft alles fehlerfrei durch.

    Woran könnte denn sowas liegen?

    Verdutzte Grüsse
    Ewgenij



  • Werte halt mal errno aus und lass dir genau sagen, was select zu beklagen hat. Vermutlich ist das FD_SETSIZE falsch! Das erste Argument sollte der größte Filedeskriptor plus 1 sein und FD_SETSIZE ist die Anzahl der Bits im fd_set bzw. das Limit.


  • Mod

    Wenn ein Programm mit unterschiedlichen Compileroptionen unterschiedliches Verhalten zeigt, dann ist das fast immer undefiniertes Verhalten, ausgelöst durch schludrige Programmierung.



  • rüdiger schrieb:

    Werte halt mal errno aus und lass dir genau sagen, was select zu beklagen hat. Vermutlich ist das FD_SETSIZE falsch! Das erste Argument sollte der größte Filedeskriptor plus 1 sein und FD_SETSIZE ist die Anzahl der Bits im fd_set bzw. das Limit.

    Hi, errno hat den Wert 4. Das ist dann

    #define EINTR 4 /* Interrupted system call */

    laut http://www.barricane.com/c-error-codes-include-errno

    FD_SETSIZE ist größer als mein größter Descriptor. Ich habe aber meine Routine geändert, sodass sie wirklich den größten Descriptor bei mir genau bestimmte. Das hatte aber keinerlei Auswirkungen auf das Programmverhalten 😞

    Gruß
    Ewgenij



  • Hallo, Leute. Ich habe das Problem gelöst und wollte mal posten, wie ich das gemacht habe. Vielleicht hat jemand ja ähnliche Probleme...

    Es sieht so aus, dass aus irgendeinem Grund das Betriebssystem mit einem Signal den System-Call (select()) gewaltsam beendet, der auf Ankunft von Nachrichten auf den Kanälen wartet. Warum das nur dann passiert, wenn ich mein Programm mit der -pg-Option kompiliere, entzieht sich meinem Verständnis. Ich habe es aber gelöst, indem ich den System-Call automatisch neu starte, wenn die errno = EINTR (Nummer 4) ist.

    Hier http://bugs.python.org/issue1049450 wird das Problem auf Solaris-Betriebssystemen beschrieben, mit der entsprechenden Lösung, an der ich mich auch orientiert habe.

    Viele Grüsse
    Ewgenij


Anmelden zum Antworten