Он работает, когда в цикле я устанавливаю каждый элемент в 0 или в entry_count-1. Он работает, когда я устанавливаю его так, чтобы entry_count был маленьким, и я пишу его вручную, а не по циклу (sorted_order [0] = 0; sorted_order [1] = 1; ... и т. Д.).Как отладить ошибку сегментации?
Пожалуйста, не говорите мне, что делать, чтобы исправить мой код. Я не буду использовать интеллектуальные указатели или векторы по очень конкретным причинам. Вместо этого сосредоточьтесь на вопросе: Какие условия могут вызвать этот segfault? Спасибо.
---- OLD -----
Я пытаюсь отлаживать код, который не работает на компьютере UNIX. Суть этого кода заключается в следующем:
int *sorted_array = (int*)memory;
// I know that this block is large enough
// It is allocated by malloc earlier
for (int i = 0; i < entry_count; ++i){
sorted_array[i] = i;
}
Кажется, что segfault находится где-то в цикле. К сожалению, переход в режим отладки делает остановку segfault. Используя отладку cout, я обнаружил, что она должна быть в цикле.
Далее я хотел бы знать, как далеко в этом цикле СЛУЧИЛОСЬ так выдаёт ошибку сегментации я добавил:
std::cout << i << '\n';
Он показал весь диапазон был, предполагают, чтобы быть зацикливание снова и не было выдаёт ошибку сегментации.
С небольшим количеством экспериментов я в конечном итоге создал поток строк перед циклом и записал в него пустую строку для каждой итерации цикла и не было segfault.
Я пробовал некоторые другие разнообразные операции, пытаясь выяснить, что происходит. Я попытался установить переменную j = i; и тому подобное, но я ничего не нашел.
Запуск valgrind Единственная информация, которую я получил на segfault, состояла в том, что это была «ошибка общей защиты» и что-то вроде ответа по умолчанию на 11. В нем также упоминается, что есть условный переход или перемещение зависит от неинициализированных значений, но, глядя на код, я не могу понять, как это возможно.
Что это может быть? У меня нет идей для изучения.
Что говорит вам отладчик? Как вы знаете, что блок достаточно велик? Как это было выделено? С этого момента изменился ли параметр 'entry_count'? Почему вы не используете 'std :: vector'? –
Нам нужно увидеть больше кода. Предполагая, что 'int * memory = new int [entry_count]', тогда все должно быть ОК. Или загрузите файл «core» в gdb и покажите нам вывод 'where' и' bt full'. Наконец, вы должны использовать 'new' или better,' std :: vector'. – jww
Ничто в коде, которое вы предоставили, не должно указывать на segfault, если ваши предположения о 'memory' правильны. Я предлагаю использовать 'std :: vector', который будет проверяться на хороших компиляторах отладки и, вероятно, немедленно покажет вашу проблему. –