0

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

4

1 回答 1

0

好吧,与其给你一条鱼,我会教你如何钓鱼……

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

如何检测问题发生在哪里? 好吧,当您的程序接收到 Linux 时,它的信息量不是很大,SEGFAULT但是它为您提供了很多信息。你只需要知道如何“阅读”它。

coredump是发生分段错误时内存、堆栈和变量的图片。运行它

gdb myapp core

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

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 this 将向您显示从您的应用程序 main() 到实际故障的回溯,包括传递给函数的参数。

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

几点注意事项:

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

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

于 2013-04-09T20:12:19.170 回答