【问题标题】:Segmentation fault in file parsing code文件解析代码中的分段错误
【发布时间】:2012-01-19 02:37:37
【问题描述】:

当我尝试运行执行矩阵加法的程序时遇到分段错误。我正在尝试单独运行程序约 1000 次(同时对每次运行进行计时并将结果写入文件)。

问题是,经过多次运行后出现分段错误 - 我能走多远取决于矩阵的大小。例如,如果我运行一个 10x10 矩阵(每个实例都有随机生成的数字),我会在 1013 次运行后出现分段错误。对于 100x100 矩阵,我在 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]);
    }
}

此代码重复运行,直到出现分段错误(每次读取的文件具有不同的编号)。如果您需要更多代码,请告诉我。任何帮助将不胜感激。

【问题讨论】:

  • 首先您应该以不同的方式读取这些值。我认为将每一行读取为 char 数组并将其拆分会更好,然后您可以使用 atof 转换每个子字符串。除此之外,GDB 告诉您错误在 readFromFile 中,那么为什么您假设错误发生在将数字传输到 GPU 时?
  • 您确定 500 始终足以容纳您想要的信息吗?无论如何,最好学习如何使用调试器。它可以准确地告诉您故障发生在哪里以及当时您的索引值是多少。此外,您似乎在这里有内存泄漏,token 永远不会被释放。

标签: c segmentation-fault


【解决方案1】:

有许多问题可能导致您发布的代码中出现分段错误。让我列举几个:

  • 正如 Jens 指出的那样,您有多确定任何令牌的大小实际上是
  • 您有多确定没有像 1.32.4 这样的连续数字? ATOF 可能会因此而崩溃,因此请改用 strtod
  • 使用调试器来运行程序,正如 ma​​cs 指出的那样,它会为您提供崩溃所在的行,并且您可以看到变量的值,从而为您提供更好的思路
  • 在读取输入时使用安全检查,因为连续编号可能是最少的问题。多个 '\n' 字符可能会搞砸。
  • 由于所有内容都是文本,我建议您使用 fscanf 阅读,而不是构建自己的版本。
  • 阅读Row major vs. Column Major formats,具体取决于您可能不需要跟踪维度的数据

【讨论】:

    【解决方案2】:

    如何为矩阵分配内存?同样重要的是,你释放它吗?无论如何,提示:使用-g 选项编译您的程序以生成调试信息,并学习如何使用调试器。然后你会发现问题,而我们只能猜测。

    【讨论】:

      猜你喜欢
      • 2015-07-30
      • 2015-08-02
      • 1970-01-01
      • 1970-01-01
      • 2011-07-17
      • 1970-01-01
      • 2013-04-12
      • 1970-01-01
      相关资源
      最近更新 更多