C: Ошибка сегментации 11 только в терминале, а не в отладчике - PullRequest
0 голосов
/ 18 января 2019

Я создаю программу, которая читает файл, инвертирует его по частям и сохраняет результат в новом файле без выделения фрагментов размером более 1 КБ. Когда я запускаю его в терминале, он создает файл, но не записывает в него, вместо этого он падает и выдает ошибку сегментации 11. Когда я пытаюсь отладить его с помощью lldb, весь код выполняется без проблем. Мой терминал использует другие правила распределения, чем lldb? Как я могу решить это?

Я запускал код с большими и маленькими файлами, но даже с почти пустым txt-файлом он вылетает. Я использую OSX 10.10.5 с lldb-340.4.119

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 голосов
/ 18 января 2019

Разница между запуском в отладчике и без него может быть связана с отключением отладчиком ASLR. Это может скрыть проблему, когда вы пытаетесь ее отладить.

Попробуйте отменить это. кажется , что в LLDB это должно быть сделано с помощью команды

settings set target.disable-aslr false

, который должен отменить отключение ASLR. В ГБД это было бы

set disable-randomization off

Не забудьте перезапустить программу под вашим отладчиком (без перезапуска отладчика!), Чтобы этот параметр вступил в силу. В GDB это команда run, нечто подобное должно быть в LLDB.

...