Segmentation fault

...IDE, compilers, κλπ

Συντονιστής: konnn

Segmentation fault

Δημοσίευσηαπό utnubu » 14 Μαρ 2012, 00:09

Καλησπέρα,
προσπαθώ να τραβήξω κάποιες πληροφορίες από ένα sip πακέτο με τον παρακάτω κώδικα.
Αυτό που παίρνω όταν τρέχω τον κώδικα είναι segmantation fault.
Αν κάποιος μπορεί να βοηθήσει,θα είμαι ευγνώμων. :bow:
Κώδικας: Επιλογή όλων


char * tch; /* Parsing pointer for strtok function */
char * from; /* "From" pointer */
char * contact; /* "Contact" pointer */
char * user; /* "User" pointer */
char * callid; /* "Call-ID" pointer */
char * payload; /* Packet's Payload */
tch = strtok (payload,"<>;\n\"");
while (tch != NULL)
{
if (strncmp(tch, "From",4)==0) /* Comparation of first 4 chars to "From" and if so collect it*/
{
tch = strtok (NULL, "<>;\n\"");
from = tch;
printf ("\n SIP From: %s \n", from);
}
if (strncmp(tch, "Contact",7)==0) /* Comparation of first 7 chars to "Contact" and if so collect it*/
{
tch = strtok (NULL, "<>;\n\"");
contact = tch;
printf (" SIP Contact: %s \n", contact);
}
if (strncmp(tch, "Authorization",13)==0) /* Comparation of first 13 chars to "Authorization" and if so collect it*/
{
tch = strtok (NULL, "<>;\n\"");
user = tch;
printf (" SIP User: %s \n", user);
}
if (strncmp(tch, "Call-ID",7)==0) /* Comparation of first 7 chars to "Call-ID" and if so collect it*/
{
callid = tch;
printf (" %s \n", callid);
}
tch = strtok (NULL, "<>;\n\"");
}
Τελευταία επεξεργασία από utnubu και 15 Μαρ 2012, 12:45, έχει επεξεργασθεί 1 φορά/ες συνολικά
Γνώσεις ⇛ Linux: Αρχάριος ┃ Προγραμματισμός: Μέτριος┃ Αγγλικά: Καλά
Λειτουργικό ⇛ Ubuntu 10.04 32bit
Προδιαγραφές ⇛ Intel Core 2Duo E8200 2,66GHz │ RAM 2GB │
utnubu
babeTUX
babeTUX
 
Δημοσιεύσεις: 4
Εγγραφή: 05 Οκτ 2011, 12:00
Εκτύπωση

Re: Sip Parser

Δημοσίευσηαπό simosx » 14 Μαρ 2012, 03:39

Εδώ χρειάζεται να δώσεις ένα ολοκληρωμένο πρόγραμμα, κατά προτίμηση όσο το δυνατόν πιο μικρό. Και να μπορεί να μεταγλωττιστεί.

Ακόμα, μπορείς να δώσεις και ένα αρχείο .pcap όπου να μπορεί να χρησιμοποιήσει κάποιος μαζί με το tcpreplay για να διαπιστώσει το σφάλμα.

Εναλλακτικά, μπορείς να μεταγλωττίσεις ο ίδιος το πρόγραμμά σου με την παράμετρο -g ώστε κατά το Segmentation fault να μπορέσεις να εντοπίσεις σε ποια γραμμή συμβαίνει το σφάλμα. Δες ακόμα και το πρόγραμμα ddd για εκσφαλμάτωση (διαθέσιμο από το Κέντρο λογισμικού).
προσωπικό ιστολόγιο ϗ πλανήτης Ubuntu-gr
Συμβάλετε και εσείς στο ελληνικό βιβλίο Ubuntu!
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.10 saucy 3.11.0-031100rc1-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD E-450 APU with Radeon HD Graphics ‖ RAM 3555 MiB ‖ Sony Corporation VAIO
4 AMD nee ATI Wrestler [Radeon HD 6320] [1002:9806] {fglrx_pci}
5 eth0: Atheros Inc. AR8151 v2.0 Gigabit Ethernet [1969:1083] (rev c0) ⋮ wlan0: Atheros Inc. AR9285 [168c:002b] (rev 01)
Φτιάξτε και εσείς τη δική σας υπογραφή (παραπάνω κείμενο) αυτόματα με κλικ εδώ!
simosx
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10334
Εγγραφή: 11 Μάιος 2008, 18:52
Launchpad: simosx
IRC: simosx
Εκτύπωση

Re: Sip Parser

Δημοσίευσηαπό migf1 » 15 Μαρ 2012, 02:38

utnubu έγραψε:Καλησπέρα,
προσπαθώ να τραβήξω κάποιες πληροφορίες από ένα sip πακέτο με τον παρακάτω κώδικα.
Αυτό που παίρνω όταν τρέχω τον κώδικα είναι segmantation fault.
Αν κάποιος μπορεί να βοηθήσει,θα είμαι ευγνώμων. :bow:
Spoiler: show
Κώδικας: Επιλογή όλων


char * tch; /* Parsing pointer for strtok function */
char * from; /* "From" pointer */
char * contact; /* "Contact" pointer */
char * user; /* "User" pointer */
char * callid; /* "Call-ID" pointer */
char * payload; /* Packet's Payload */
tch = strtok (payload,"<>;\n\"");
while (tch != NULL)
{
if (strncmp(tch, "From",4)==0) /* Comparation of first 4 chars to "From" and if so collect it*/
{
tch = strtok (NULL, "<>;\n\"");
from = tch;
printf ("\n SIP From: %s \n", from);
}
if (strncmp(tch, "Contact",7)==0) /* Comparation of first 7 chars to "Contact" and if so collect it*/
{
tch = strtok (NULL, "<>;\n\"");
contact = tch;
printf (" SIP Contact: %s \n", contact);
}
if (strncmp(tch, "Authorization",13)==0) /* Comparation of first 13 chars to "Authorization" and if so collect it*/
{
tch = strtok (NULL, "<>;\n\"");
user = tch;
printf (" SIP User: %s \n", user);
}
if (strncmp(tch, "Call-ID",7)==0) /* Comparation of first 7 chars to "Call-ID" and if so collect it*/
{
callid = tch;
printf (" %s \n", callid);
}
tch = strtok (NULL, "<>;\n\"");
}

Είμαι πολύ κουρασμένος για να κοιτάξω τώρα τον κώδικα, αλλά αυτό εδώ...

Κώδικας: Επιλογή όλων

...
char * payload; /* Packet's Payload */
tch = strtok (payload,"<>;\n\"");
...

φωνάζει "seg fault"!

Το payload πρέπει να είναι non-NULL στην 1η κλήση της strtok() (και NULL στις υπόλοιπες)... εσύ το περνάς με undefined content στην 1η κλήση της strtok().
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Sip Parser

Δημοσίευσηαπό Star_Light » 15 Μαρ 2012, 03:13

Kαι δεν χρειαζεται να το θυμάσαι και απεξω πως το 1ο ορισμα της strtok() ειναι NULL

Κώδικας: Επιλογή όλων
tch = strtok (NULL, "<>;\n\"");


Και μαλιστα το χει αλλες τοσες φορες !!!!!!!!!

Ο δεικτης οπως ειπε και ο migf1 χρησιμοποιειται χωρις να εχει αρχικοποιηθει.

Ειναι δικος σου ο κωδικας? Απο που τον πηρες??? και τι θες να κανεις με αυτον?
ΑΝ θες βοηθεια πρεπει να μοιραστεις καποιες πληροφοριες.
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Segmentation fault

Δημοσίευσηαπό utnubu » 15 Μαρ 2012, 12:33

Συγνώμη παιδιά λάθος στο copy-paste.
Το payload δεν είναι null ο κώδικας μου έχει βασιστεί στο http://www.tcpdump.org/sniffex.c
Αυτό που θέλω είναι να διατρέξω το payload ενος sip πακέτου και να τραβήξω συγκεκριμένες πληροφορίες,γι'αυτό και κάνω χρήση της strtok που το κατακερματίζει.
Όποιος ανοίξει το αρχείο που παρατείθεται θα καταλάβει αμέσως τι παίζει.
Ο κώδικας που έχω ανεβάσει είναι ένα μικρό τμήμα(χρήση της strtok) στο οποίο και μου χτυπάει το πρόβλημα.

Μορφοποιημένος Κώδικας: Επιλογή όλων
char * payload;
int count=1;
udp = (struct sniff_udp*)(packet + SIZE_ETHERNET + SIZE_UDP);
size_payload = ntohs(ip->ip_len) - (size_ip + SIZE_UDP);

/* define computer udp payload (segment) offset */
payload = (u_char *)(packet + SIZE_ETHERNET + size_ip + SIZE_UDP);

char search_reg[]="REGISTER"; /* search for register method in payload */
char search_sip[]="Via: SIP"; /* variable to identify sip packet */


if (strstr(payload, search_sip))
{
/* compute udp payload (segment) size */
if (size_payload > ntohs(udp->uh_ulen))
{
size_payload = ntohs(udp->uh_ulen);
}
printf("\n SIP Packet number %d:\n", count);
count++;
int reg_method = 0; /* variable to identify sip method*/
if (strstr(payload, search_reg))
{
reg_method = 1; /* sip method is REGISTER*/
if ( reg_method==1)
printf("\n REGISTER METHOD \n");
}

if (size_payload > 0)
{
char * tch; /* Parsing pointer for strtok function */
char * from; /* "From" pointer */
char * contact; /* "Contact" pointer */
char * user; /* "User" pointer */
char * callid; /* "Call-ID" pointer */
tch = strtok (payload,"<>;\n\"");
while (tch != NULL)
{
if (strncmp(tch, "From",4)==0) /* Comparation of first 4 chars to "From" and if so collect it*/
{
tch = strtok (NULL, "<>;\n\"");
from = tch;
printf ("\n SIP From: %s \n", from);
}
if (strncmp(tch, "Contact",7)==0) /* Comparation of first 7 chars to "Contact" and if so collect it*/
{
tch = strtok (NULL, "<>;\n\"");
contact = tch;
printf (" SIP Contact: %s \n", contact);
}
if (strncmp(tch, "Authorization",13)==0) /* Comparation of first 13 chars to "Authorization" and if so collect it*/
{
tch = strtok (NULL, "<>;\n\"");
user = tch;
printf (" SIP User: %s \n", user);
}
if (strncmp(tch, "Call-ID",7)==0) /* Comparation of first 7 chars to "Call-ID" and if so collect it*/
{
callid = tch;
printf (" %s \n", callid);
}
tch = strtok (NULL, "<>;\n\"");
}
Τελευταία επεξεργασία από utnubu και 15 Μαρ 2012, 19:44, έχει επεξεργασθεί 2 φορά/ες συνολικά
Γνώσεις ⇛ Linux: Αρχάριος ┃ Προγραμματισμός: Μέτριος┃ Αγγλικά: Καλά
Λειτουργικό ⇛ Ubuntu 10.04 32bit
Προδιαγραφές ⇛ Intel Core 2Duo E8200 2,66GHz │ RAM 2GB │
utnubu
babeTUX
babeTUX
 
Δημοσιεύσεις: 4
Εγγραφή: 05 Οκτ 2011, 12:00
Εκτύπωση

Re: Segmentation fault

Δημοσίευσηαπό migf1 » 15 Μαρ 2012, 14:15

Κάνε έναν κόπο και άλλαξε το bbcode του παραπάνω κώδικα από [code ]...[/code ] σε [z_code ]...[/z_code ] για να μορφοποιηθεί με syntax-highlighting ο κώδικας, και θα τον κοιτάξω μόλις ευκαιρήσω.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Segmentation fault

Δημοσίευσηαπό migf1 » 15 Μαρ 2012, 14:31

Α και btw, αν τον κάνεις compile με commad-line flag -g3 στον gcc, και τρέξεις μετά το εκτελέσιμο στον gdb, μόλις σκάσει το seg-fault και σταματήσει η εκτέλεση, γράψε μέσα στον gdb: bt για να κάνει backtrace και να σου δείξει σε ποια συνάρτηση και σε ποια γραμμή δημιουργήθηκε το πρόβλημα.

Αν δεν σε βοηθάει, γράψε μας εδώ σε ποια γραμμή λέει πως βγάζει το πρόβλημα.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Segmentation fault

Δημοσίευσηαπό migf1 » 16 Μαρ 2012, 15:50

Thanks για το [z_code ]! Του έριξα μια ματιά, αλλά θέλει να κάτσω να το δω συγκεντρωμένος... το έβαλες στον gdb που σου είπα, να μας πει σε ποια γραμμή σκάει;
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Segmentation fault

Δημοσίευσηαπό konnn » 02 Μάιος 2012, 09:29

Στην επιλεγμένη γραμμή λαμβάνω segmentation fault και δε μπορώ να καταλάβω γιατί.

έγραψε:#include <stdio.h>
//#include <stdlib.h>
//# include <time.h>

void print_board(int **);

int main(){

int board[8][8] = {
{1,0,1,0,1,0,1,0},
{0,1,0,1,0,1,0,1},
{1,0,1,0,1,0,1,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,2,0,2,0,2,0,2},
{2,0,2,0,2,0,2,0},
{0,2,0,2,0,2,0,2}
};


print_board(board);

return 0;
}
void print_board(int **b){
int i,j;
for (i=0;i<8;i++){
for(j=0;j<8;j++){
if (b[i][j]==1) printf("X");
else if (b[i][j]==2) printf("O");
else printf(".");
}
printf("\n");
}
}
1 Linux: Μέτριος ┃ Προγραμματισμός: Μέτριος ┃ Αγγλικά: Προχωρημένος
2 Desktop : Ubuntu 16.04 64bit
a Intel Core i3 CPU 530 2.93GHz ‖ RAM 3824 MiB ‖ Intel DH55HC -
b nVidia Device [10de:1040] (rev a1)
c eth0: Intel 82578DC Gigabit Network Connection
3 Notebook : Ubuntu 16.04 64 bit
a Intel Core i3-2365M CPU @ 1.40GHz ‖ RAM 3854 MiB ‖ LENOVO 20197
b Intel 2nd Generation Core Processor Family Integrated Graphics Controller
c 5 wlan0: Intel Centrino Wireless-N 2230 ⋮ eth0: Realtek RTL8101E/RTL8102E

Αυτόματη υπογραφή.
Άβαταρ μέλους
konnn
Συντονιστής
Συντονιστής
 
Δημοσιεύσεις: 3568
Εγγραφή: 12 Ιούλ 2010, 17:54
Τοποθεσία: Καλαμάτα
Launchpad: konnn
Εκτύπωση

Re: Segmentation fault

Δημοσίευσηαπό migf1 » 02 Μάιος 2012, 11:16

Καλημέρα,

το πρόβλημα είναι στη δήλωση του b στην print_board()... άλλαξέ την από int **b είτε σε int b[8][8] είτε σε int b[][8] και θα είσαι OK. Από ANSI-C και μετά δεν μπορείς να δηλώνεις 2Δ πίνακες σε πρότυπα χωρίς να δηλώσεις τουλάχιστον το μήκος της κάθε γραμμής του.

Ο compiler σου βγάζει warning εκεί (αν δεν τις έχεις ήδη, ενεργοποίησέ τες με -Wall -Wextra)
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση


Επιστροφή στο Εφαρμογές για Ανάπτυξη Λογισμικού