Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » GNU/Linux » Segmentation fault

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
09.04.2003, 22:14 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hallo,
ich kriege immer folgende Fehlermeldung beim Start eines selbstgeschriebenen Programmes:


C++:
Initializing Classes... Done

Start of Serverlist:

Segmentation fault



bzw einfach nur


C++:
./gateway: line 4: 21134 Segmentation fault      ./uogate



wenn ich das Programm über ein Script starte.

Woran kann so etwas liegen?
die Stelle ist so:


C++:
  FILE *f = fopen("server.ini","rb");
  if(f)
  {
    int iPos = 0;
    char cTempL[1025];
    ServerList Temp;
    memset(&Temp,0,sizeof(Temp));
    while(fgets(cTempL,1024,f))
    {
      for(int x = 0; x < 1025; x++)
      {
        if(cTempL[x] < 32)
          cTempL[x] = '\0';
      }
      switch(iPos)
      {
      case 0: // Serverstring
        {
          Temp.sServer = cTempL;
          //Console.send("> Name: %s\n", cTempL);
        } break;
      case 1: // Serverip
        {
          Temp.sIP = cTempL;

          unsigned long ip = 0;        
          sockaddr_in saSin;
          hostent *heHost = NULL;
          saSin.sin_family = AF_INET;
          ip = inet_addr(cTempL);
          if (ip == INADDR_NONE)
          {
            heHost = gethostbyname(cTempL);

            Console.send("> Host: %s ", cTempL);
            if (heHost == NULL)  
            {
#ifdef _WIN32
    errno = WSAGetLastError();
#endif
              sprintf((char*)cTemp, "warning: %d resolving name: %s\n", errno, cTempL);
              LogWarning((char*)cTemp);
              LogWarning("switching to localhost\n");

              Console.send("(%s)", "127.0.0.1");
            }
            else
            {
              memcpy((char*)&(saSin.sin_addr), heHost->h_addr, heHost->h_length);

              Temp.sIP = sock_ntop(saSin);
              Console.send("(%s)", sock_ntop(saSin).c_str());
            }
            Console.send("\n");
          }
          else
          {
            Console.send("> IP: %s\n", cTempL);    
         }
        } break;
      case 2: // Serverport
        {
          Temp.usPort = atoi(cTempL);
          //Console.send("> Port: %s\n\n", cTempL);
          m_ServerList.push_back(Temp);
          Temp.sServer = "";
          Temp.sIP = "";
          Temp.usPort = 0;
          memset(&Temp,0,sizeof(Temp));
          iPos = -1;
        } break;
      }
      iPos++;
      memset(cTemp,0,sizeof(cTemp));
    }
    fclose(f);

    return 1;
  }
  return 0;



sServer und sIP sind std::string
kann es vielleicht daran liegen? wenn ich die namensauflösung rausmache, bekomme ich trotzdem der/die/das Segmentation fault!
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
09.04.2003, 23:42 Uhr
virtual
Sexiest Bit alive
(Operator)


Die "Stelle" ist aber ziemlich lang! - Compilier doch mal mit Debuginfos und mach dann nach dem Absturz ein

C++:
gdb program core


(Musst aber core files erzegen dürfen). Dann solltest du ziemlich exakt geagt bekommen, wo es knallt.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
10.04.2003, 13:54 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Wie kompiliert man Debuginfos unter Linux?!? (Ich kompiliere über konsole, hab keine windowmanager installiert)

Hab nun mal etwas mit sprintf rumgebastelt, er springt an der Stelle


C++:
Temp.sServer = cTempL;



raus

das Temp-Struct ist so definiert:


C++:
struct ServerList
{
  std::string sIP;
  std::string sServer;
  unsigned char ucFull;
  unsigned char ucTime;
  unsigned short usIndex;
  unsigned short usPort;
};


--
class God : public ChuckNorris { };

Dieser Post wurde am 10.04.2003 um 14:06 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
10.04.2003, 14:14 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hab nun mal die std::string's durch char arrays ersetzt, nun funktioniert das ganze
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
10.04.2003, 14:35 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


nur das ich trotzdem ab und zu Segmentation failures kriege, einfach so ... woran kann das liegen?
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
10.04.2003, 15:32 Uhr
virtual
Sexiest Bit alive
(Operator)


Also Debuginfos bekommst Du mit -ggdb. Schau mal in die Hilfe vom gcc, das hilft!
Dann:

C++:
struct ServerList
{
std::string sIP;
std::string sServer;
unsigned char ucFull;
unsigned char ucTime;
unsigned short usIndex;
unsigned short usPort;
};
...
ServerList Temp;
...
memset(&Temp,0,sizeof(Temp));


Also wenn Du solche Sache machst, brauchst Du dich um ein IGSEGV nicht zu wundern. memset/memmov/memcpy oder wie sie alle heissen sind in verbindung mit Objekten gaaaanz schlecht. Darf man nie machen!



[/cpp]
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
10.04.2003, 19:14 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


naja, gibt es eine genauso einfache Methode ein Struct auf "0" zu setzen? unter windoof klappt das mit memset ja problemlos, unter linux nun da ich char benutze auch, ich hab nun überall std::string durch char arrays ersetzt, nun krieg ich keine segmentation errors mehr
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
10.04.2003, 19:44 Uhr
virtual
Sexiest Bit alive
(Operator)


Unter Windows werden aber auch Speicherlöcher entstehen. Schreib zur Klasse eine Methode "clear" und gut ist.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
14.04.2003, 13:12 Uhr
~xeno
Gast


schau dir mal die man-pages von 'calloc' an, eventuell kannst mit dem was anfangen...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
14.04.2003, 13:13 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


etz funzt alles, hab alles etwas umgeschrieben ...
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ GNU/Linux ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: