Nowe posty

xx Problem ze sterownikami. (5)
2024-04-13, 21:25:16
xx Instalacja xfce4 (2)
2024-04-13, 16:20:17
xx Serie kompilacji bez instalacji dla “emerge” w Gentoo (2)
2024-04-08, 18:40:04
xx Plasma 6 w Neonie ssie trochę mniej ... (17)
2024-04-05, 10:03:46
xx Problem z Linux Lite po instalacji (3)
2024-04-03, 14:23:40
xx Jak właczyć num locka przy starcie systemu debian 12? (12)
2024-04-02, 17:43:54
xx Brak dźwieku w systemie. (5)
2024-04-02, 16:13:41
xx Dystrybucja pod HP Omen (7)
2024-03-29, 11:33:05
xx [Poradnik] Wyszukiwanie Sterowników (2)
2024-03-27, 21:08:23
xx Ile pingwinów? (1)
2024-03-27, 08:59:24

Autor Wątek: [C++] Segmentation fault (core dumped).  (Przeczytany 9103 razy)

kriss123456

  • Gość
[C++] Segmentation fault (core dumped).
« dnia: 2009-02-07, 17:34:24 »
Witam :)
mam jeszcze jedno wazne pytanie, mam nadzieje ze ostanie.
W trakcie uruchamiania programu pojawia się wlasnie blad:
"Segmentation fault (core dumped) "
Z tego co czytalem to jest zla skladnia programu, a wyniki sa zapisywane do pliku core.
Problem w tym ze nie wiem gdzie jest blad. Pod Windowsem wszystko hula a pod Ubuntu juz nie chce. Moze gdyby ktos rzucil okiem to by dostrzegl od razu dlaczego tak sie dzieje. wkleje fragment programu.

int main(int argc, char *argv[])
{
int d,n;    
ifstream kluczpryw;                            //wczytanie z pliku
kluczpryw.open("pryw.txt");                //klucza prywatnego
kluczpryw >> d >> n;                              
kluczpryw.close();  
 
ifstream in(argv[1]);                      //otwarcie pliku z szyfrogramem
i
nt slowo;
 
FILE * wyjscie;                                   //otwarcie pliku do ktorego ma zostac
if (argv[2]==NULL)
wyjscie = fopen ("tekstjawny.txt","a");                 //zapisana jawna postac tekstu
else wyjscie = fopen (argv[2],"a");  

unsigned int b,i,u;
unsigned int uu[i];


if (in==NULL) perror ("Blad otwarcia pliku");        
  else
  {
    //cout<< "\\n\\n\\Wiadomosc w trakcie deszyfrowania......" ;  
   
    slowo=0;  
    while (in >> slowo >> hex)                            //wczytywanie kolejnych blokow liczbowych zapisanych jako hex
    {
          u=pot_modulo(slowo,d,n);                        //deszyfrowanie podniesienie bloku do potegi d w mod n
          for(i=0; i<=2; ++i)                             //odczytanie z bloku 24 bit 3 znakow (bajtow)
            {  
               uu[i]=u >> ((2-i)*8);                      //przy kazdym powtorzeniu przesun w prawo blok o 1 bajt
               fputc (uu[i],wyjscie);                     //i zapisz znak do pliku (jawny)
            }
    }

  }    
     
 fclose (wyjscie);     //zamknij pilk
   
    return EXIT_SUCCESS;
}
prawdopodobnie blad jest gdzies przy otwieraniu i zamykaniu pliku i pobierniu z niego informacji. ale nie wiem jak to zlokalizowac.
ewentualnie gdyby mi powiedzial ktos jak pobierac cale slowa (oddzielone spacja) z pliku innym sposobem niz tutaj.
Jesli sie komus bedzie chcialo to od razu dziekuje za pomoc :))))

Offline mateo86

  • Users
  • Guru
  • *****
  • Wiadomości: 647
    • Zobacz profil
[C++] Segmentation fault (core dumped).
« Odpowiedź #1 dnia: 2009-02-07, 18:06:43 »
Bbcode!!!

ZipoKing

  • Gość
[C++] Segmentation fault (core dumped).
« Odpowiedź #2 dnia: 2009-02-07, 18:36:17 »
1. BBCode!!!
2. Jeżeli już używasz C++ i strumieni, rób to wszędzie, a nie tylko w wybranych przypadkach
3. Kompilacja z opcją -g, następnie odpalenie programu przez gdb pozwoli znacznie szybciej zlokalizować błąd.
4. argv[2] - to może być to - tak się nie sprawdza czy taki parametr istnieje, od tego jest argc ;)

mikolajS.

  • Gość
[C++] Segmentation fault (core dumped).
« Odpowiedź #3 dnia: 2009-02-07, 20:36:57 »
Linia: if (argv[2]==NULL) jest zupełnie bez sensu.  Jeżeli nie podasz parametrów programu to argv[2] nie istnieje i masz właśnie "Segmentation fault "
Odwołanie do adresu pamięci nie zaalokowanego nie zawsze jest zauważane przez system, szczególnie taki który jest słabo napisany :)

kriss123456

  • Gość
[C++] Segmentation fault (core dumped).
« Odpowiedź #4 dnia: 2009-02-07, 21:03:13 »
co do argv[2] to w innym programie tak zrobilem i dzialalo. zreszta tutaj uruchamialem go zarowno z parametrami jak i bez i nie chce dzialac. dawalem tez zamaist argv domyslne nazwy. wydaje mi sie ze wszystko powinno byc zrobione strumieniem i dlatego nie dziala. przetestuje jutro i napisze czy pomoglo :)

pozdrawiam i dziekuje za pomoc :)

chmooreck

  • Gość
[C++] Segmentation fault (core dumped).
« Odpowiedź #5 dnia: 2009-02-07, 21:55:31 »
Cytat: kriss123456
"Segmentation fault (core dumped) "
Z tego co czytalem to jest zla skladnia programu, a wyniki sa zapisywane do pliku core.
Składnia jest sprawdzana na etapie kompilacji. Ten błąd oznacza próbę odwołania do nie Twojej pamięci.

kriss123456

  • Gość
[C++] Segmentation fault (core dumped).
« Odpowiedź #6 dnia: 2009-02-07, 22:06:07 »
czyli problem moze wynikac z tego ze odpalam ubuntu z trybu LIVE ?
zreszta jest to program deszyfrujacy, natomiast mam tez drugi szyfrujacy dzialajacy analogicznie ("w druga strone") do powyzszego i tam problemu nie ma....

ZipoKing

  • Gość
[C++] Segmentation fault (core dumped).
« Odpowiedź #7 dnia: 2009-02-08, 11:49:34 »
Cytat: kriss123456
czyli problem moze wynikac z tego ze odpalam ubuntu z trybu LIVE ?
zreszta jest to program deszyfrujacy, natomiast mam tez drugi szyfrujacy dzialajacy analogicznie ("w druga strone") do powyzszego i tam problemu nie ma....
Może poniższy opis pomoże ci w zrozumieniu problemu ;)
Tablica argv zawiera w rzeczywistości wskaźniki do obszarów pamięci, w których zapisane są poszczególne parametry programu (niech argv = A i pracujemy w systemie 32-bitowym, wtedy pod adresem A masz zapisany argument 0 (nazwa programu), pod adresem A+4 pierwszy argument, pod A+8 drugi itd.) Gdy podasz programowi jeden parametr, wtedy tablica ta będzie miała dwa elementy: argv[0] z nazwą programu i argv[1] z tym parametrem. Gdy teraz w kodzie programu wpiszesz argv[2], system pobierze wartość spod adresu A+8, pod którym oczywiście będą jakieś śmieci, i wartość tą potraktuje jako adres pamięci, spod którego ma odczytać wartość parametru. I tutaj masz dwa wyjścia: albo ten losowy "adres" będzie wskazywał na obszar pamięci, który przypadkiem należy do programu (jak to ma miejsce w przypadku programu szyfrującego), albo będzie wskazywał na jakieś miejsce w pamięci, które nie należy do programu (co z kolei wygeneruje błąd segmentacji pamięci).
Najzwyczajniej w świecie zamiast argv[2] == null powinieneś napisać argc < 3. To, co napisałeś, jest doskonałym przykładem tzw. błędu przepełnienia bufora, na który jak widzisz Windows nie jest zbytnio odporny.

kriss123456

  • Gość
[C++] Segmentation fault (core dumped).
« Odpowiedź #8 dnia: 2009-02-08, 13:38:46 »
dobra troche zmienilem program. pozbylem sie z pliku chwilo argv, dalem wszedzie strumienie. Odpalilem debuggera i cos takiego mi wyswietlil
Program received signal SIGSEGV, Segmentation fault.
0x08048e91 in main (argc=Cannot access memory at address 0x12452e80
) at deszyfr.cpp:71
71    {
tylko nie wiem za bardzo jak to porpawic. domyslam sie ze chodzi o 71 linijke, od ktorejj  zaczyna sie petla while:
    while (in >> slowo >> hex)                          
    {

          u=pot_modulo(slowo,d,n);                        
          for(i=0; i<=2; ++i)                            
            {  

               uu[i]=u >> ((2-i)*8);                    
               wyj <<(char)uu[i];                        
            }

    }
jednak gdy wylaczylem ten fragment z programu problem nie zniknal a debugger wskazywal na osatnia linijke.

wie moze ktos o co chodzi ? :) co zrobic zeby smigalo??

ZipoKing

  • Gość
[C++] Segmentation fault (core dumped).
« Odpowiedź #9 dnia: 2009-02-08, 18:46:34 »
Gdyby jeszcze wiadomo było co oznaczają zmienne in, slowo, hex. IMHO któraś z tych zmiennych jest wskaźnikiem i próbujesz przesunąć bity w adresie, pod którym wskazuje, a następnie spod tak przesuniętego adresu coś wydobyć.

mikolajS.

  • Gość
[C++] Segmentation fault (core dumped).
« Odpowiedź #10 dnia: 2009-02-08, 19:21:03 »
Przy wczytywaniu najpierw powinien być manipulator hex,.
Linia: unsigned int uu; to potencjalna katastrofa, najpierw ustaw wartość i ! A najlepiej zastosować dynamiczną alokację.
Sprawdzaj najpierw argc zanim sięgniesz to tablicy argv[]
Trudno mi zrozumieć dlaczego do czytania plik otwierasz za pomocą I/O Stream, a do zapisu w stylu C.
A błąd być może jest w funkcji:  u=pot_modulo(slowo,d,n);

kriss123456

  • Gość
[C++] Segmentation fault (core dumped).
« Odpowiedź #11 dnia: 2009-02-08, 19:26:40 »
dobra rozwiazlem zagadke :D
najblizej był mikolajS. :P
Metodami prob i bledow (wylaczajac kolejne sekcje programu) doszedlem do tego ze problem byl w uu. kiedy ustawilem normalnie zmienna jako int uu (bo wektor tak na prawde nie byl potrzebny) blad zniknal i wszystko dzialalo jak trzeba :)
Dziekuje wszystkim za pomoc, znow nauczlem sie czego nowego :)
POZDRAWIAM!!