【问题标题】:segmentation fault process returned 139 (0x8b)分段错误进程返回 139 (0x8b)
【发布时间】:2012-12-03 18:03:12
【问题描述】:

我是 Linux 和代码块的新手。在构建下面的代码时,我收到此错误:

"分段错误进程返回 139 (0x8b)"

我知道这与记忆有关,但我找不到问题所在。在使用 Makefile 或在终端中单独编译文件时,我没有收到任何错误。

main 接收 2 个参数 (argv) ComputersInNet.txt - > argv[1] Simulation.txt -> argv[2]

而且我无法弄清楚如何使用代码块将这些文件添加到项目中,而且在 Windows (Visual Basic) 中代码也可以完美运行。

我无法正确粘贴代码(5 个文件:2 .h 和 3 .cpp),您可以从下面的链接下载它们,包括我用作参数的两个 txt 文件。

http://depositfiles.com/files/cv2bwmz74

【问题讨论】:

  • 嗯,一个系统中的段错误通常在另一个系统中运行良好,因为内存溢出的后果取决于您正在溢出的内存中的内容,这取决于平台,所以我不会担心为什么它适用于一个而不是另一个。也就是说,您是否检查了所有指针以确保它们已初始化而不是 NULL?
  • 在这里发布代码,而不是让我们下载并解压缩它;)
  • 是的,我刚刚访问了链接,看到了下载设置并犹豫了。
  • 你试过在gdb或者valgrind下运行吗?
  • 感谢大家的快速回放!!很抱歉没有粘贴我尝试过的代码,但结果并不好。我已经重新检查过,每个初始化为 'NULL' 的指针都更改为 - * X;没有初始化为 NULL。但仍然得到同样的错误在构建日志中我得到这一行:“进程以状态 0(分钟 6 秒)终止,所以我猜构建部分运行良好,但在运行部分它失败了

标签: c++ linux segmentation-fault


【解决方案1】:

出现代码sn-p问题,从main()调用子程序Create_PC_List()创建计算机列表。

void Router :: Create_PC_List (char *fname) //Reads from file & creates list of computers
{
char C;
char* IPAD=NULL;
FILE* fp;
FILE* msg;
int counter=0;
fp = fopen (fname,"r"); //Reading from Argv parameter file - list of computers in the network
if(fp == NULL)
        cout << "Opening file failed: %s\n" << strerror(errno) << endl;
msg = fopen (fname, "r"); //Reading from Argv parameter file - list of computers in the network
    while((C=fgetc(fp)) != EOF) //Running trougth the file
{
    ...

输出:

Opening file failed: No such file or directory
followed  by segmentation fault.

我们可以看到fopen() 失败并出现错误"No such file or directory"。因此,您需要找到一种方法将三个文本文件添加到代码块中,以供fopen() 使用。

分段错误的第二个原因是提供给getc() 的fp 是一个FILE * 指针,其中包含一个不是有效FILE 对象的NULL 地址。

【讨论】:

  • 感谢您的快速回放!正如我之前提到的,我已经尝试添加这些文件,但我怀疑我做对了。这是我在代码块中写入文件名的地方:postimage.org/image/9kauxc42b 但我仍然遇到相同的分段错误。有什么建议???
  • @DavidFaiz 我认为这些 .txt 文件应该放在项目菜单 -> 程序参数而不是主机应用程序中。查看 CB 帮助论坛。
  • 在这个链接中你可以看到我没有区域可以写文件名 postimage.org/image/9kauxc42b
  • 代码片段上的几个 cmets - 1) 无论fopen() 是否失败,您都在输出“打开文件失败...” - 那里没有if 语句。 2) 第二个fopen() 也可能失败,但你永远不会检查它。 3) 如果第一个 fopen() 确实失败了,你仍然试图用结果调用 fgetc(),这充其量是未定义的行为,并且很可能是分段错误的根源,这取决于你的编译器/库/系统版本。
  • @twalberg 是的,我完全同意你的看法。我错过了在我的答案中放置正确的陈述。理想情况下,我们应该返回;当 fopen() 返回 NULL。在调试时,我记得它确实有效,并且在打开文件失败时返回时没有出现段错误。感谢您指出这一点。
猜你喜欢
  • 1970-01-01
  • 2016-04-17
  • 2019-04-05
  • 1970-01-01
  • 2017-01-20
  • 1970-01-01
  • 2021-04-08
  • 1970-01-01
  • 2021-12-23
相关资源
最近更新 更多