#linux #memory-management #64-bit
#linux #управление памятью #64-разрядный
Вопрос:
Я пытаюсь отследить проблему segfault в старом коде C (написанном не мной). Сбои segfaults происходят только в том случае, если адреса определенных переменных в этом коде превышают 32-битный целочисленный предел. (Итак, у меня есть довольно хорошая идея, что происходит не так, но я не знаю, где.)
Итак, мой вопрос таков: есть ли какой-либо способ заставить linux выделять память для процесса в высоком адресном пространстве? На данный момент в значительной степени зависит от того, произойдет ли ошибка segfault, что немного затрудняет отладку.
Я использую Ubuntu 10.04, ядро 2.6.31-23-generic на ноутбуке Dell inspiron 1525 с 2 ГБ оперативной памяти, если это поможет.
Заранее спасибо, Мартин.
Комментарии:
1. Вы пробовали valgrinding сначала решить проблему?
Ответ №1:
Вы можете выделить анонимный блок памяти с помощью mmap()
системного вызова, который вы можете передать в качестве аргумента, куда вы хотите, чтобы он был сопоставлен.
Ответ №2:
Я бы включил опции предупреждения -Wpointer-to-int-cast
и -Wint-to-pointer-cast
и проверил все предупреждения, которые они выдают (я полагаю, они включены в -Wall
для 64-разрядных целей). Причина, скорее всего, в чем-то, связанном с этим, и простой аудит предупреждений, выдаваемых компилятором, может быть лучшим подходом, чем использование отладчика.