c - 来自标准输入的段错误(核心转储)

标签 c segmentation-fault

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

最佳答案

好吧,我不授你鱼,而是教你如何钓鱼......

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

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

核心转储是发生段错误时的内存、堆栈和变量的图片。运行它

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

我认为,一旦您确切地知道段错误发生在哪里,解决它就会容易得多。

一些注释:

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

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

关于c - 来自标准输入的段错误(核心转储),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15911267/

相关文章:

c - 双向链表删除函数中的段错误和异常输出

c - 为什么将具有不同参数类型的函数存储到具有 void* 参数 UB 的函数指针?

C动态数组中间插入

c - 从 void 指针访问结构成员时遇到问题。

C 结构体数组的段错误

c - 为什么我在函数 (C) 的末尾出现段错误?

c - 如何尽量减少系统调用次数?在C中

c - C语言中如何实现优先级队列?

c - 如何编写段错误处理程序,以便不重新启动错误指令? (C 和 Linux)

纠正此段错误