繁体   English   中英

C程序因段错误而崩溃,但在LLDB下工作正常

[英]C program crashes with Seg Fault but work perfectly fine under LLDB

我正在编写Vanilla File读取代码。

大多数看起来像这样。

首先是头文件file.h

// fheader.h
#ifndef __file_h__
#define __file_h__
// start from here
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void readFile(FILE *fr);

FILE* openFile(char *file_name);
#endif

主文件fmain.c

#include "fheader.h"


void readFile(FILE *fr) {
    // Added Printf
    printf("\n...\n");
    printf("\n...\n");
    printf("\n...\n");
    printf("\n...\n");
  char *buffer = calloc(sizeof(char),1);
  while(!feof(fr)) {
    fread(buffer,sizeof(char),1,fr);
    printf("%s\n",buffer);
  }
  free(buffer);
  return;
}


FILE* openFile(char *file_name) {
  // printf("the file name that is going to be opened is %s",file_name);
  FILE *fr;
  fr = fopen(file_name,"r");
  return fr;
}

int main(int argc,char *argv[]) {
  if(argc < 2) {
    printf("USAGE: ./file test.txt\n");
    return 1;
  }

  if (argc > 2) {
    printf("ERROR: Too many argument\n");
    return 1;
  }
  FILE *fr;
  char *file_name = calloc(strlen(argv[1]),sizeof(char));

  strncpy(file_name,argv[1],strlen(argv[1]));
  fr = openFile(file_name);
  printf("\nReading from file\n");
  readFile(fr);
  fclose(fr);
  free(file_name);
  return 0;
}

我使用以下命令编译了代码

gcc -g3 -Wall fmain.c -o file.o

当我运行代码时

./file.o "~/workspaces/myWork/C_experiment/test.txt"

我看到Segmentation fault: 11

但是,当我在lldb中运行上述程序时,我工作并退出,返回代码0

lldb ./file.o
(lldb) run "~/workspaces/myWork/C_experiment/test.txt"
// output of the file 
Process 28806 exited with status = 0 (0x00000000)
(lldb) quit

现在,我对如何调试代码以及​​查找Seg Fault原因一无所知。

您忘记在file_name的末尾添加'\\ 0',而当您执行读取1个字符的读取操作时,则不会在缓冲区的末尾添加'\\ 0'。 如果只读一个字符,则应使用char而不是1的数组。

错误在这里:

 char *file_name = calloc(strlen(argv[1]),sizeof(char));
  strncpy(file_name,argv[1],strlen(argv[1]));
  fr = openFile(file_name);

您复制了argv [1],但没有在末尾添加“ \\ 0”。 那么fopen如何知道您的字符串在哪里停止? 您应该在calloc上添加+1,并在strncpy之后添加“ \\ 0”,如下所示:

file_name[strlen(argv[1])] = '\0';

第二个错误在这里:

 char *buffer = calloc(sizeof(char),1);
  while(!feof(fr)) {
    fread(buffer,sizeof(char),1,fr);
    printf("%s\n",buffer);
  }

您将1分配给缓冲区并读取1,这没关系,但是当您将其发送到printf时,没有在缓冲区中添加'\\ 0',所以printf如何知道在哪里停止? 您应该calloc 2而不是一个,然后添加一个buffer[1] = '\\0';

因此,使用以下修复程序:

#include "fheader.h"


void readFile(FILE *fr) {
  char buffer;
  while(!feof(fr)) {
    fread(&buffer,sizeof(char),1,fr);
    printf("%c\n",buffer);
  }
  return;
}


FILE* openFile(char *file_name) {
  // printf("the file name that is going to be opened is %s",file_name);
  FILE *fr;
  fr = fopen(file_name,"r");
  return fr;
}

int main(int argc,char *argv[]) {
  if(argc < 2) {
    printf("USAGE: ./file test.txt\n");
    return 1;
  }

  if (argc > 2) {
    printf("ERROR: Too many argument\n");
    return 1;
  }
  FILE * fr = openFile(argv[1]);
  printf("\nReading from file\n");
  readFile(fr);
  fclose(fr);
  return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM