来自stdin的分段错误(核心转储)

时间:2013-04-09 19:53:18

标签: c segmentation-fault

我正在尝试计算文件中每个单词的数量。该文件可以是stdin或命令行上提供的文件名(./ count -f filename)。到目前为止,程序在从命令行读取文件时提供正确的输出。但是当我尝试从stdin读取时会发生错误。程序首先输出正确的结果,然后给出分段错误(核心转储)。一个有趣的事情是该程序在我的mac上工作,但它在Linux上不起作用。

1 个答案:

答案 0 :(得分:0)

好的,我会告诉你如何钓鱼,而不是给你一条鱼......

当您获得segmentation fault时,表示操作系统检测到内存访问错误。 当您使用指针时,这通常发生在C / C ++中。指针是非常危险的,必须小心对待。

如何检测问题发生的位置? 好吧,当您的程序收到SEGFAULT时,Linux的信息量不大,但它会为您提供大量信息。你只需要知道如何“阅读”它。

coredump ,是分段故障发生时的内存,堆栈和变量的图片。运行它

gdb myapp core

其中myapp是您的应用程序可执行文件,核心是coredump。 现在你会看到类似的东西:

GNU gdb 19991004

Copyright 1998 Free Software ���.�

Core was generated by `testit'.

Program terminated with signal 11, Segmentation fault.

Reading symbols from /usr/lib/libstdc++-libc6.1-1.so.2...done.

Reading symbols from /lib/libm.so.6...done.

Reading symbols from /lib/libc.so.6...done.

Reading symbols from /lib/ld-linux.so.2...done.

#0  0x823221a in main () at blabla.c:3

10             *i++;       

它会准确显示哪条线导致了故障。 如果您想确切了解该行的方式,请键入bt 这将显示从应用程序main()到实际错误的回溯,包括传递给函数的参数。

我认为,一旦你确切知道分段错误发生的位置,你就会更容易解决它。

很少注意到:

  1. 如果未创建coredump。 在控制台中输入:

    ulimit -c unlimited
    
  2. 您需要使用-g编译程序,以便在gdb中启用有意义的符号名称。