gdb blockiert Prozesskommunikation



  • hi,

    ich habe ein Simulationsprogramm für Bildverarbeitung, wobei die Vorverarbeitung der Bilder durch einen eigenen Prozess erfolgt. Die Kommunikation zwischen diesem Prozess und meinem Programm geschieht über shared memory.
    Das läuft nach folgendem Schema:

    mein Programm:
       /*starten des Vorverarbeitungsprozesses:*/
       system("preproc parameter > /dev/null &");
       /*shared memory ist jetzt angelegt*/
    
       for (n=1; n<anzahl_bilder; n++) 
       {
          /*starten der Verarbeitung:*/
          Bild in shared memory laden
          Flag "Bild OK" setzen
          /*warten auf Vorverarbeitungsergebnis:*/
          loopcnt = 0;
          while (!data_available() && (loopcnt < 100) )
          {
             usleep(11000);   /*hier gebe ich dem Prozess preproc Zeit zum Arbeiten*/
             loopcnt++;
          }
          printf("preproc-Zeit: %d", loopcnt);
          Vorverarbeitungsergebnisse abholen und weiterverarbeiten
       }
    

    Mit data_available() wird ein Flag im shared memory geprüft, welches durch preproc gesetzt wird, sobald die Vorverarbeitung fertig ist.

    Das funktioniert, wenn ich das Programm einfach laufen lasse. Die normale Rechenzeit des Prozesses preproc, gemessen mit loopcnt, beträgt 20 Durchläufe der Warteschleife.
    Wenn ich jedoch mit dem Debugger arbeite - Breakpoint auf der Zeile "Vorverarbeitungsergebnisse abholen" -, läuft jedesmal loopcnt auf 100 hoch, und preproc hat kein Ergebnis geliefert.

    Der Debugger, gdb, scheint den Prozess preproc zu blockieren.
    Das Programm preproc existiert nur als Binärmodul und kann daher nicht verändert bzw. debugged werden (historisch bedingt).

    Ich stehe momentan völlig auf dem Schlauch. Hat jemand eine hilfreiche Idee?
    Alle Tipps sind sehr willkommen.


Anmelden zum Antworten