Warum der Segmentation fault?



  • Hallo Leute,

    ich habe gerade ein Problem. Ich will eine Liste von Dateien in eine Liste speichern und diese Ausgeben. Doch ich bekomme leider nur ein Segmentation fault als Antwort.

    Hier meine Main-Funktion:

    #include <iostream>
    #include "./Filelist.h"
    
    int main(int argc, char** argv)
    {
    
      Filelist i;
      i.addDir("/home/[User]/CPP/");
      i.printFiles();
    
      return 0;
    }
    

    Hier mal die Funktionen der Klasse Filelist:

    Filelist::Filelist()
    {
    }
    
    // _____________________________________________________________________________
    
    void Filelist::printFiles()
    {
      for (size_t i = 0; i < _filenameList.size(); i++)
      {
        std::cout << _filenameList[i] << "\n";
      }
    }
    
    // _____________________________________________________________________________
    
    void Filelist::addDir(std::string path)
    {
      DIR *dirHandle;
      struct dirent *dirEntry;
    
      // Open a folder
      dirHandle = opendir(path.c_str());
    
      do
      {
        dirEntry = readdir(dirHandle);
        if (dirEntry)
        {
          _filenameList.push_back(dirEntry->d_name);
          if (dirEntry->d_type == DT_DIR)
          {
            addDir(path + "/" + dirEntry->d_name);
          }
        }
      } while (dirEntry);
      closedir(dirHandle);
    }
    

    Könnt ihr mir sagen, was da falsch ist?



  • Nicht mit dem gegebenen Code. Aber Dein Debugger ist Dein Freund.



  • Kann mir gut vorstellen, dass Funktionen wie opendir und readdir im Fehlerfall was zurückgeben, womit man nicht weiterarbeiten sollte. Am besten guckst du mal in die Doku der API und prüfst die Rückgabewerte.



  • RETURN VALUE
    The opendir() and fdopendir() functions return a pointer to the directory stream. On error, NULL is returned, and errno is set appropriately.

    Dh, wenn der Ordner nicht existiert oä., gibts NULL zurück und du dereferenzierst es.



  • dirHandle = opendir(path.c_str());
    

    Ich vermute, dass diese Funktion NULL zurückgibt. Wenn das der Fall ist dann bin ich mir sicher, dass dein Programm hier crasht:

    dirEntry = readdir(dirHandle);
    

    Fazit: es wäre gut nach dem opendir-Aufruf zu überprüfen ob dirHandle NULL ist oder nicht.

    Edit:
    Upps, Ethon war schneller 😃



  • Also ich hab ein wenig mit strace rumprobiert und hab nun folgende Funktion mittlerweile. Diese funktioniert auch soweit ganz gut.

    void Filelist::addDir(std::string path)
    {
      DIR *dirHandle;
      struct dirent *dirEntry;
    
      // Open a folder
      dirHandle = opendir(path.c_str());
    
      do
      {
        dirEntry = readdir(dirHandle);
        if (dirEntry)
        {
          std::string s;
          s.append(path);
          s.append(dirEntry->d_name);
          _filenameList.push_back(s.c_str());
    
          // add the subfolder, if the actual file is a folder
          if (isdir(s))
          {
            std::cout << "--- " << s << " is a dir.\n";
            // if the dir is . or .., then don't search these folders
            // but all other folder
            if (!((s[s.size() - 1] == '.') || 
              ((s[s.size() - 1] == '.') && (s[s.size() - 2] == '.'))))
            {
              s.append("/");
              addDir(s);
            }
          }
    
        }
      } while (dirEntry);
      closedir(dirHandle);
    }
    

Anmelden zum Antworten