分段错误很奇怪

时间:2012-02-09 13:13:37

标签: linux ubuntu client segmentation-fault

问题:当我尝试编译我的文件并运行时,它存在分段问题。当我将文件传递给我的朋友时(他使用相同版本的ubuntu),服务器将能够运行。我想知道为什么?

下面是我整个页面的代码。 就个人而言,我觉得它没有任何问题,但我会将其粘贴以供参考,以防有人要求。

void readNStoreData ()
{
char words[MAX];
char *wholeLine;
char* delimiter = ",";
int cflag = 0;
int x, count = 0;
char input;

FILE *countryFile;
countryFile = fopen("Countries.txt","r");

if (!countryFile) {
exit(EXIT_FAILURE);
}

while (fgets (words, MAX - 1, countryFile) != NULL)
{
    //atof to convert string to double
    //split a single line into individual tokens indicating , as the delimeter
    //afterwards store them into array
    wholeLine = strtok (words, delimiter);
    strcpy (records [count].TDL, wholeLine);
    wholeLine = strtok (NULL, ",");
    strcpy (records [count].cName, wholeLine);
    wholeLine = strtok (NULL, delimiter);
    strcpy (records [count].FIPS104, wholeLine);
    wholeLine = strtok (NULL, delimiter);
    strcpy (records [count].ISO2, wholeLine);
    wholeLine = strtok (NULL, delimiter);
    strcpy (records [count].ISO3, wholeLine);
    wholeLine = strtok (NULL, delimiter);
    records [count].ISO = atof(wholeLine);
    wholeLine = strtok (NULL, delimiter);
    strcpy (records [count].cCapital, wholeLine);
    wholeLine = strtok (NULL, delimiter);
    strcpy (records [count].cRegion, wholeLine);
    wholeLine = strtok (NULL, delimiter);
    strcpy (records [count].cCurrencyName, wholeLine);
    wholeLine = strtok (NULL, delimiter);
    strcpy (records [count].cCurrencyCode, wholeLine);
    wholeLine = strtok (NULL, delimiter);
    records [count].cPopulation = atof(wholeLine);
count++;
}
fclose(countryFile); //close file
}

我希望有人能够在某个地方发现错误。 感谢前进给那些帮助过的人!

运行gdb,错误实际上是这一行。 它位于这个功能中。

    l(gdb) frame 1
    l#1  0x08048936 in readNStoreData () at testserver.c:61
    61                      strcpy (records [count].cName, wholeLine);

2 个答案:

答案 0 :(得分:2)

强烈建议您要学会使用debugger,例如GDB。您可以通过sudo apt-get install gdb

在ubuntu上安装它

这是一个简短的tutorial

Google finds更多examples

修改

由于您现在正在运行GDB,请尝试在run之前设置breakpoint

(gdb) br testserver.c:61

在您执行run之后,您应该能够print各种变量并查看哪些变量是非法的。

答案 1 :(得分:0)

您对strcpy的来电失败。您将错误的参数传递给它(有关文档,请参阅http://www.opengroup.org/sud/sud1/xsh/strcpy.htm。)

如果您希望我们分析此内容,您需要向我们展示

  • 如何定义records
  • 元素结构类型的定义是什么,
  • 如何初始化records数组,以及有多少元素,
  • 如何限制count不超出records数组
  • 的容量
  • 如何确保records[count].cName(可能是char*char[])足够大,以包含strtok解析的令牌

      

    注意 最大可能的令牌是MAX个字符,因为它可能是fgets + 1个尾随NUL字符iff返回的MAX行长度输入中没有单个delimiter字符。

  •   
  这应该会让你开始。

我有一种潜在的怀疑,你可能忘记了完全初始化接收阵列(records),但是,除非你显示更多代码,否则我们无法知道。