2013-07-11 7 views
1

lorsque j'exécute mon programme, je reçois un message d'erreur "Segmentation fault" du système.Erreur de segmentation dans C

Je veux savoir s'il existe un moyen de savoir exactement l'instruction (code ligne) qui a causé le crash du système Segmentation message de défaut »

code

===>

#include "GeoIP.h" 

int main() 
{ 
    FILE *f; 
    char ipAddress[30]; 
    char expectedCountry[3]; 
    char expectedCountry3[4]; 
    const char *returnedCountry; 
    GeoIP *gi; 
    int failed = 0; 
    int test_num = 1; 

    int i; 
    for (i = 0; i < 2; ++i) { 
     if (0 == i) { 
      /* Read from filesystem, check for updated file */ 
      gi = GeoIP_open("/usr/share/GeoIP/GeoIP.dat", 
          GEOIP_STANDARD | GEOIP_CHECK_CACHE); 
     } else { 
      /* Read from memory, faster but takes up more memory */ 
      gi = GeoIP_open("/usr/share/GeoIP/GeoIP.dat", GEOIP_MEMORY_CACHE); 
     } 

     if (gi == NULL) { 
      fprintf(stderr, "Error opening database\n"); 
      exit(1); 
     } 

     /* make sure GeoIP deals with invalid query gracefully */ 
     returnedCountry = GeoIP_country_code_by_addr(gi, NULL); 
     if (returnedCountry != NULL) { 
      fprintf(stderr, 
        "Invalid Query test failed, got non NULL, expected NULL\n"); 
      failed = 1; 
     } 

     returnedCountry = GeoIP_country_code_by_name(gi, NULL); 
     if (returnedCountry != NULL) { 
      fprintf(stderr, 
        "Invalid Query test failed, got non NULL, expected NULL\n"); 
      failed = 1; 
     } 

     f = fopen("/home/aa/test/country_test.txt", "r"); 

     while (fscanf(f, "%s%s%s", ipAddress, expectedCountry, expectedCountry3) 
       != EOF) { 
      returnedCountry = GeoIP_country_code_by_addr(gi, ipAddress); 
      if (returnedCountry == NULL 
       || strcmp(returnedCountry, expectedCountry) != 0) { 
       fprintf(stderr, 
         "Test addr %d for %s failed, got %s, expected %s\n", 
         test_num, ipAddress, returnedCountry, expectedCountry); 
       failed = 1; 
      } 
      returnedCountry = GeoIP_country_code_by_name(gi, ipAddress); 
      if (returnedCountry == NULL 
       || strcmp(returnedCountry, expectedCountry) != 0) { 
       fprintf(stderr, 
         "Test name %d for %s failed, got %s, expected %s\n", 
         test_num, ipAddress, returnedCountry, expectedCountry); 
       failed = 1; 
      } 
      returnedCountry = GeoIP_country_code3_by_addr(gi, ipAddress); 
      if (returnedCountry == NULL 
       || strcmp(returnedCountry, expectedCountry3) != 0) { 
       fprintf(stderr, 
         "Test addr %d for %s failed, got %s, expected %s\n", 
         test_num, ipAddress, returnedCountry, expectedCountry); 
       failed = 1; 
      } 
      returnedCountry = GeoIP_country_code3_by_name(gi, ipAddress); 
      if (returnedCountry == NULL 
       || strcmp(returnedCountry, expectedCountry3) != 0) { 
       fprintf(stderr, 
         "Test name %d for %s failed, got %s, expected %s\n", 
         test_num, ipAddress, returnedCountry, expectedCountry); 
       failed = 1; 
      } 
      test_num++; 
     } 
     fclose(f); 

     f = fopen("/home/aa/test/country_test2.txt", "r"); 
     while (fscanf(f, "%s%s", ipAddress, expectedCountry) != EOF) { 
      returnedCountry = GeoIP_country_code_by_addr(gi, ipAddress); 
      if (returnedCountry == NULL 
       || strcmp(returnedCountry, expectedCountry) != 0) { 
       fprintf(stderr, "Test addr %d %s failed, got %s, expected %s\n", 
         test_num, ipAddress, returnedCountry, expectedCountry); 
       failed = 1; 
      } 
      test_num++; 
     } 
     fclose(f); 

     f = fopen("/home/aa/test/country_test_name.txt", "r"); 
     while (fscanf(f, "%s%s", ipAddress, expectedCountry) != EOF) { 
      returnedCountry = GeoIP_country_code_by_name(gi, ipAddress); 
      if (returnedCountry == NULL 
       || strcmp(returnedCountry, expectedCountry) != 0) { 
       fprintf(stderr, "Test addr %d %s failed, got %s, expected %s\n", 
         test_num, ipAddress, returnedCountry, expectedCountry); 
       failed = 1; 
      } 
      test_num++; 
     } 

     fclose(f); 
     GeoIP_delete(gi); 
    } 
    return failed; 
} 

grâce

+3

Utilisez [Valgrind] (http://en.wikipedia.org/wiki/Valgrind) pour cela. –

+3

Avez-vous essayé d'exécuter votre programme via un débogueur tel que gdb? – Hasturkun

+2

Bien sûr, compilez avec -g, puis exécutez avec le débogueur ('gdb myprogram') –

Répondre

8

Comme beaucoup l'ont dit: Utilisez un débogueur ou un outil comme valgrind.

Cependant cela pourrait certainement être une source de problèmes (je l'ai dépouillé des parties non intéressantes):

if (returnedCountry == NULL || ...) { 
    fprintf(stderr, ".. %s ..\n", returnedCountry...); 
    ... 
} 

Il y a plusieurs cas comme celui-ci. Vous avez également fopen appels où vous ne vérifiez pas la valeur de retour. Toujours faire cela.

+0

+1 Nice catch Jite –

+0

Ensuite. J'ai eu des fautes de segmentation de printf et co. avant, en raison de relâcher les contrôles NULL. Cependant, ceci si le bloc vérifie NULL alors essaye de l'imprimer quand même ??? – Craig

2

ajouter -g à votre ligne de commande et la compilation vous êtes libre d'utiliser ou gdb./a.outvalgrind ./a.out

(ici ./a.out est le nom de votre programme)

+2

'a.out' est le nom du programme –