Перейти к содержанию
    

Задание размера кучи для модуля Linux

Подскажите пожалуйста, каким образом при сборке программы для Linux задается размер кучи, в которой будет динамически выделяться память?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гуглится по "linux module heap size". Например.

Фактически, ЕМНИП, нет никакого механизма, чтобы конкретному модулю ядра "урезать" размер кучи до определенного значения. А вот в юзерспейсе можно всякими лимитами это дело ограничить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Разве ограничение для динамической памяти задается? 

или вам принципиально ограничить?

Изменено пользователем new123

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 7/4/2020 at 7:53 PM, new123 said:

Разве ограничение для динамической памяти задается? 

или вам принципиально ограничить?

 

Так вот я и хочу понять. Просто мой процесс при определенных условиях падает с segfault.

Я вывел в лог адреса динамически выделяемых буферов и увидел, что эти буфера выходят за пределы области,

которая в файле maps для этого процесса помечена как [heap].

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Harvester said:

Просто мой процесс при определенных условиях падает с segfault.

А что valgrind говорит?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, Harvester said:

Так вот я и хочу понять. Просто мой процесс при определенных условиях падает с segfault.

Я вывел в лог адреса динамически выделяемых буферов и увидел, что эти буфера выходят за пределы области,

понятно. Причин может быть много. Утечка памяти или пытаетесь обращаться например у массивов к несуществующим индексам.
1) Я бы сделал ulimit -c unlimited команду. Когда получите сегфаулт, вам сохранится весь дамп файл corexxxx.
2) дальше с помощью gdb смотрите на каком момент упал процесс (на какой строчке кода).  gdb ./ваш_софт corexxxx и там уже внутри команду history, посмотрите что делалось в этот момент

3) Еше вариант, как совет выше valgrind. valgrind --tool=memcheck Но тут нужно быть подготовленным, чтобы расшифровать

В любом случае удачи.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

39 minutes ago, new123 said:

понятно. Причин может быть много. Утечка памяти или пытаетесь обращаться например у массивов к несуществующим индексам.
1) Я бы сделал ulimit -c unlimited команду. Когда получите сегфаулт, вам сохранится весь дамп файл corexxxx.
2) дальше с помощью gdb смотрите на каком момент упал процесс (на какой строчке кода).  gdb ./ваш_софт corexxxx и там уже внутри команду history, посмотрите что делалось в этот момент

3) Еше вариант, как совет выше valgrind. valgrind --tool=memcheck Но тут нужно быть подготовленным, чтобы расшифровать

В любом случае удачи.

Я попробую это сделать, когда будет возможность. Надеюсь, все эти утилиты будут в системе (у меня кастомный линукс на ядре 2.6).

А Вы можете пояснить, что означает строка [heap] в файле maps? Это действительно куча для динамической памяти или что-то другое?

На самом деле программа очень простая - после сигнала выделяет несколько буферов, выполняет некую обработку, записывает данные в файл и освобождает буферы. Процесс всегда одинаков, отличается только размер обрабатываемых данных.

Вот, что находится в файле maps:

10670000-106ac000 rwxp 00000000 00:00 0          [heap]

48000000-48020000 r-xp 00000000 00:0b 1701       /lib/ld-2.13.so

При большом объеме данных выделяются такие буферы (1, 2 и 4 - фиксированного размера):

Realloc max buffer:   1068edd8 - 1068ee34

Realloc coeff buffer: 1068ee38 - 1068ee94

Realloc data buffer:  48070008 - 4810c408

Realloc write buffer: 1068ee98 - 106aea98

При этом буфер “data” выделяется не в куче, а черт-знает где, а буфер “write” вылазит за границу кучи, указанную в maps.

Но в этом случае процесс еще не падает, а вроде бы нормально работает.

При небольшом объеме данных выделяются такие буферы:

Realloc max buffer:   1068edd8 - 1068ee34

Realloc coeff buffer: 1068ee38 - 1068ee94

Realloc data buffer:  1068ee98 - 106ae298

Realloc write buffer: 106ae2a0 - 106cdea0

В этом случае все буфера выделяются в куче и получается, что буфер write” полностью лежит вне границ, указанных в maps.

В этом случае наблюдается segfault.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

19 minutes ago, gosha-z said:

А какой смысл в таком мастодонте?

Видимо, поддержка старого оборудования. У нас тоже из-за допотопных PCI'ных CAN-контроллеров компьютеры, управляющие метровым и шестиметровым телескопом, крутятся на доисторическом ядре 2.6. Все объясняется банальной ленью: некому переписать старые модули ядра под 5.х или сделать проще: заменить CAN-контроллеры на современные...

Но я вот не понял, что нужно ТСу: сначала он пишет про модуль ядра, а потом оказывается, что ему просто утилитку какую-то надо оттрейсить, чтобы понять, откуда там сегфолт…

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, Eddy_Em said:

Видимо, поддержка старого оборудования. У нас тоже из-за допотопных PCI'ных CAN-контроллеров компьютеры, управляющие метровым и шестиметровым телескопом, крутятся на доисторическом ядре 2.6. Все объясняется банальной ленью: некому переписать старые модули ядра под 5.х или сделать проще: заменить CAN-контроллеры на современные...

Но я вот не понял, что нужно ТСу: сначала он пишет про модуль ядра, а потом оказывается, что ему просто утилитку какую-то надо оттрейсить, чтобы понять, откуда там сегфолт…

Для начала я как минимум хочу понять, какая взаимосвязь между областью [heap] и динамически выделяемыми буферами.

Просто, если я для МК задаю в скрипте линкера кучу, я понимаю, что выделение будет производиться в этой области и при нехватке памяти ошибка возникнет уже в момент выделения. А как в случае линукса - непонятно.

И, кстати, я нигде не говорил про модуль ядра.

Изменено пользователем Harvester

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 часов назад, Harvester сказал:

И, кстати, я нигде не говорил про модуль ядра.

 

Название собственной темы забыли?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

47 minutes ago, andrew_b said:

Название собственной темы забыли?

И где там "ядро"?

Впрочем, если я неправильно употребил слово "модуль", приношу извинения.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

23 hours ago, Harvester said:

Вот, что находится в файле maps:

ага, я не правильно понял вашу проблему. У вас out of memory.

Покажите вывод ulimit -a

Что там в max memory size? 240 чтоли?

Изменено пользователем new123

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 часов назад, Harvester сказал:

Для начала я как минимум хочу понять, какая взаимосвязь между областью [heap] и динамически выделяемыми буферами.

а вы для разнообразия приведите на какой архитектуре запускаете, как память запрашиваете и вывод лога сегфолта.. в мире линукса есть простейшее правило, чем больше информации при вопросе вы дадите, тем выше вероятность получения ответа.. может у вас срабатывает какой-нить OOM..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...