C:分段错误11仅在终端中,而不在调试器中

时间:2019-01-18 15:37:58

标签: c debugging terminal lldb

我正在编写一个程序,该程序读取一个文件,一点一点地反转它,并将结果存储在一个新文件中,而不会分配大于1kb的块。当我在终端中运行它时,它将创建文件但未写入文件,而是崩溃并给出分段错误11。当我尝试使用lldb对其进行调试时,整个代码运行没有任何问题。我的终端是否遵循与lldb不同的分配规则?我该如何解决?

我已经使用大大小小的文件运行了代码,但是即使是几乎空的txt文件,它也会崩溃。 我正在使用lldb-340.4.119运行osx 10.10.5

int const CHUNK_SIZE = 1024;
int chunk_index = 0;
int character;
char new_filename[] = "output";

struct Chunk {
  struct Chunk *previous;
  int data[(CHUNK_SIZE-sizeof(struct Chunk*))/sizeof(int)];
};

struct Chunk* memory = (struct Chunk *)malloc(sizeof(struct Chunk));
struct Chunk* temp;

FILE *fp;
fp = fopen(argv[1], "r");

    // read file into memory
character = fgetc(fp);
do {
  memory->data[chunk_index] = character;
  chunk_index++;
  if ( chunk_index*sizeof(int) > CHUNK_SIZE-sizeof(struct Chunk*)){
    chunk_index = 0;
    temp = (struct Chunk *)malloc(sizeof(struct Chunk));
    temp->previous = memory;
    memory = temp;
  }
  character = fgetc(fp);
}
while (character !=EOF);
chunk_index--;
fclose(fp);


    // write to new file
fp = fopen(new_filename, "wb");

do {
  while (chunk_index >=0) {
    printf("%c", memory->data[chunk_index]);
    fprintf(fp, "%c", memory->data[chunk_index]);
    chunk_index--;
  }

  chunk_index = (CHUNK_SIZE-sizeof(struct Chunk*))/sizeof(int);
  temp = memory;
  memory = memory->previous;
  free(temp);
} while(memory!=NULL);

1 个答案:

答案 0 :(得分:1)

在调试器中运行与不运行调试器之间的差异可能是由于调试器禁用了ASLR。当您尝试调试它时,这可能会隐藏问题。

尝试撤消此操作。 seems应该在LLDB中使用命令

where c.DealCode not like '10%' or (c.DealCode like '10%' and estyear > 2018)

,应撤消ASLR的禁用功能。在GDB中应该是

settings set target.disable-aslr false

请不要忘记在调试器下重新启动程序(无需重新启动调试器!),以使此设置生效。在GDB中,它是set disable-randomization off 命令,在LLDB中应该有类似的内容。