Jump to content

    
Harvester

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

Recommended Posts

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

 

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
On 7/4/2020 at 7:53 PM, new123 said:

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

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

 

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

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

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

Share this post


Link to post
Share on other sites
2 hours ago, Harvester said:

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

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

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

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

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

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
19 minutes ago, gosha-z said:

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

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

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

Share this post


Link to post
Share on other sites
2 hours ago, Eddy_Em said:

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

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

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

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

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

Edited by Harvester

Share this post


Link to post
Share on other sites
47 minutes ago, andrew_b said:

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

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

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

 

Share this post


Link to post
Share on other sites
23 hours ago, Harvester said:

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

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

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

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

Edited by new123

Share this post


Link to post
Share on other sites
11 часов назад, Harvester сказал:

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.