获取“分段错误核心转储”

Posted

技术标签:

【中文标题】获取“分段错误核心转储”【英文标题】:Getting "segmentation fault core dump" 【发布时间】:2013-09-28 15:00:30 【问题描述】:

我是 C 的初学者,我必须使用叉子和管道做一个练习 我必须创建一个填充管道的父进程(使用键盘:stdin)和一个必须读取管道并将其打印在屏幕上的子进程。

但是这段代码的执行给我带来了“分段错误核心转储” 我已经在 J​​ava 上编程过,这相当于“NullpoinerException”,对吗? 我正在寻求帮助,因为我在 2 小时后就遇到了这个问题 谢谢

#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int main()


  char* p;
  char* buffer;
  int fd[2];

  pid_t pid = fork();
  pipe(fd);

  //Cas du fils consommateur (Lire dans la pipe, et afficher le contenu a l'ecran ) 
  if (pid == 0)
  
    close(fd[1]);

    int a;
    do
    
      a = read(fd[0], buffer, 512);
      //printf("consomateur: %s",  buffer);
     while (a != 0);

    //Cas du père producteur (remplir la pipe par saisie au clavier)
  
  else
  
    close(fd[0]);
    char *adString;

    printf("Enter data \n");
    do
    
      adString = fgets(buffer, 20, stdin); // on recupere dans un buffer les donneés lues
      write(fd[1], buffer, 512); // on met dans la pipe ce qu'on a mis dans le buffer
     while (strcmp(adString, "") != 0);

  

  return 0;

【问题讨论】:

关于来源中的 cmets:我认为这里的大多数人都不会说法语。 【参考方案1】:

缺少为指针分配内存的代码:

char* buffer;

例如这一行:

a = read(fd[0], buffer, 512);

读取到一个随机地址,这很可能导致分段违规。


要解决此问题,您可能希望像这样声明 buffer

char buffer[512 + 1] = ""; /* Defines buffer to hold 513 bytes and initialise them to 0. */

引用+ 1:为了在C 中存储“字符串”,需要一个附加字符来存储“字符串”的0-终止符,标记“字符串”的结尾。


如果 C 中存在 NULL 指针异常,则可能导致分段错误。然而,后者通常发生在访问无效的内存地址时,例如NULL

被转储的核心是进程死亡时的映像。此时您可以使用此核心文件来检查进程。为此,请使用 gdb:

gbd <program-path/program-file> <core-path/core-file>

【讨论】:

非常感谢您。

以上是关于获取“分段错误核心转储”的主要内容,如果未能解决你的问题,请参考以下文章

分段错误(核心转储)

运行我的代码时出现分段错误(核心转储)问题

pyqt5 中的分段错误(核心转储)

编程求解器的分段错误(核心转储)

在命名管道中获取分段错误(核心转储)错误

分段错误(核心转储) - 无法访问的计数器值