Ошибка сегментации в коде синтаксического анализа файла - PullRequest
2 голосов
/ 13 декабря 2011

Я получаю ошибку сегментации, когда пытаюсь запустить свою программу, которая выполняет добавление матрицы.Я пытаюсь запустить программу отдельно ~ 1000 раз (во время каждого запуска и записи результата в файл).

Проблема в том, что я получаю ошибку сегментации после нескольких запусков - насколько далеко я получаю, зависит от размера матрицы.Например, если я запускаю матрицу 10x10 (каждый экземпляр имеет случайно сгенерированные числа), я получаю ошибку сегментации после ровно 1013 прогонов.Для матрицы 100x100 я получаю segfault при 260 пробегах.

Краткий обзор работы программы выглядит следующим образом:

  1. Числа генерируются случайным образом и записываются в файл в зависимости от введенного ввода (10x10, 100x100)
  2. Числа считываются из файла и отправляются в CUDA *
  3. CUDA вычисляет результаты и записывает их в файл результатов (а также время, затрачиваемое на вычисление, и записывает его в другой файл)

* Похоже, что этот шаг вызывает ошибку сегментации в соответствии с отладчиком GDB.Ниже выводится ошибка отладчика и функция, которая вызывает ошибку.

>Program terminated with signal 11, Segmentation fault.
#0  0x0000000000402f4c in readFromFile(int, char, int&, int&, float*) ()

Вот фактическая функция:

  void readFromFile(int fd, char byte, int &matrixWidth, int &matrixHeight,float *matrix)
    {
    int tokenIndex = 0;
    char *token = (char*) malloc(500); 
    int matrixIndex = 0;
    while(read(fd,&byte,1)){
        if(isdigit(byte)||byte=='.'){
            token[tokenIndex]=byte;
            tokenIndex++;
        }
        else if(byte==' ' && matrixHeight==0){
            matrixWidth++;
            token[tokenIndex]='\0';
            matrix[matrixIndex]=atof(token);
            //printf("Stored: %d\n",matrixOne[matrixIndex]);
            tokenIndex=0;
            matrixIndex++;
        }
        else if(byte=='\n'){
            matrixHeight++;
            if(tokenIndex!=0){
                token[tokenIndex]='\0';
                matrix[matrixIndex]=atof(token);
                //printf("Stored: %d\n",matrixOne[matrixIndex]);
                tokenIndex=0;
                matrixIndex++;
            }
        }
        else if(byte==' ' && matrixHeight!=0){
            token[tokenIndex]='\0';
            matrix[matrixIndex]=atof(token);
            tokenIndex=0;
            matrixIndex++;
        }
        //printf("Token: %s, number matrix: %f\n" , token, matrix[matrixIndex-1]);
    }
}

Этот код многократно запускается до сбоя сегментации (каждый раз, когда файл, который он читает, имеет разные номера).Если вам нужно больше кода, просто дайте мне знать.Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 17 декабря 2011

Как вы распределяете память под матрицу? Не менее важно, вы освобождаете это? В любом случае, подсказка: скомпилируйте вашу программу с опцией -g, чтобы сгенерировать отладочную информацию, и научитесь использовать отладчик. Тогда вы найдете проблему, а мы можем только догадываться.

0 голосов
/ 16 декабря 2011

Есть много проблем, которые могут вызвать ошибку сегментации в коде, который вы разместили. Позвольте мне перечислить несколько:

  • Как Дженс указал, насколько вы уверены, что размер любого токена на самом деле <500 символов </li>
  • Насколько вы уверены, что нет таких номеров, как 1.32.4? ATOF может привести к сбою, поэтому вместо этого используйте strtod
  • Используйте отладчик для запуска программы, указав macs , который даст вам строку, на которой произошел сбой, и вы сможете увидеть значения переменных, чтобы дать вам лучшее представление
  • Используйте проверки безопасности при считывании входных данных, так как числа запуска могут быть наименьшей из проблем. Несколько символов '\ n' могут привести к путанице.
  • Поскольку все текстовое, я бы посоветовал вам читать, используя fscanf, а не создавать свою собственную версию.
  • Читайте о Основные строки по сравнению с основными форматами столбцов в зависимости от того, какими могут быть данные, вам может не потребоваться отслеживать измерения
...