Harvester 0 2 июля, 2020 Опубликовано 2 июля, 2020 · Жалоба Подскажите пожалуйста, каким образом при сборке программы для Linux задается размер кучи, в которой будет динамически выделяться память? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eddy_Em 1 2 июля, 2020 Опубликовано 2 июля, 2020 · Жалоба Гуглится по "linux module heap size". Например. Фактически, ЕМНИП, нет никакого механизма, чтобы конкретному модулю ядра "урезать" размер кучи до определенного значения. А вот в юзерспейсе можно всякими лимитами это дело ограничить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 4 июля, 2020 Опубликовано 4 июля, 2020 (изменено) · Жалоба Разве ограничение для динамической памяти задается? или вам принципиально ограничить? Изменено 4 июля, 2020 пользователем new123 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Harvester 0 6 июля, 2020 Опубликовано 6 июля, 2020 · Жалоба On 7/4/2020 at 7:53 PM, new123 said: Разве ограничение для динамической памяти задается? или вам принципиально ограничить? Так вот я и хочу понять. Просто мой процесс при определенных условиях падает с segfault. Я вывел в лог адреса динамически выделяемых буферов и увидел, что эти буфера выходят за пределы области, которая в файле maps для этого процесса помечена как [heap]. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gosha-z 2 6 июля, 2020 Опубликовано 6 июля, 2020 · Жалоба 1 hour ago, Harvester said: Просто мой процесс при определенных условиях падает с segfault. А что valgrind говорит? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 6 июля, 2020 Опубликовано 6 июля, 2020 · Жалоба 2 hours ago, Harvester said: Так вот я и хочу понять. Просто мой процесс при определенных условиях падает с segfault. Я вывел в лог адреса динамически выделяемых буферов и увидел, что эти буфера выходят за пределы области, понятно. Причин может быть много. Утечка памяти или пытаетесь обращаться например у массивов к несуществующим индексам. 1) Я бы сделал ulimit -c unlimited команду. Когда получите сегфаулт, вам сохранится весь дамп файл corexxxx. 2) дальше с помощью gdb смотрите на каком момент упал процесс (на какой строчке кода). gdb ./ваш_софт corexxxx и там уже внутри команду history, посмотрите что делалось в этот момент 3) Еше вариант, как совет выше valgrind. valgrind --tool=memcheck Но тут нужно быть подготовленным, чтобы расшифровать В любом случае удачи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Harvester 0 6 июля, 2020 Опубликовано 6 июля, 2020 · Жалоба 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gosha-z 2 6 июля, 2020 Опубликовано 6 июля, 2020 · Жалоба 7 hours ago, Harvester said: кастомный линукс на ядре 2.6 А какой смысл в таком мастодонте? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eddy_Em 1 6 июля, 2020 Опубликовано 6 июля, 2020 · Жалоба 19 minutes ago, gosha-z said: А какой смысл в таком мастодонте? Видимо, поддержка старого оборудования. У нас тоже из-за допотопных PCI'ных CAN-контроллеров компьютеры, управляющие метровым и шестиметровым телескопом, крутятся на доисторическом ядре 2.6. Все объясняется банальной ленью: некому переписать старые модули ядра под 5.х или сделать проще: заменить CAN-контроллеры на современные... Но я вот не понял, что нужно ТСу: сначала он пишет про модуль ядра, а потом оказывается, что ему просто утилитку какую-то надо оттрейсить, чтобы понять, откуда там сегфолт… Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Harvester 0 6 июля, 2020 Опубликовано 6 июля, 2020 (изменено) · Жалоба 2 hours ago, Eddy_Em said: Видимо, поддержка старого оборудования. У нас тоже из-за допотопных PCI'ных CAN-контроллеров компьютеры, управляющие метровым и шестиметровым телескопом, крутятся на доисторическом ядре 2.6. Все объясняется банальной ленью: некому переписать старые модули ядра под 5.х или сделать проще: заменить CAN-контроллеры на современные... Но я вот не понял, что нужно ТСу: сначала он пишет про модуль ядра, а потом оказывается, что ему просто утилитку какую-то надо оттрейсить, чтобы понять, откуда там сегфолт… Для начала я как минимум хочу понять, какая взаимосвязь между областью [heap] и динамически выделяемыми буферами. Просто, если я для МК задаю в скрипте линкера кучу, я понимаю, что выделение будет производиться в этой области и при нехватке памяти ошибка возникнет уже в момент выделения. А как в случае линукса - непонятно. И, кстати, я нигде не говорил про модуль ядра. Изменено 6 июля, 2020 пользователем Harvester Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 7 июля, 2020 Опубликовано 7 июля, 2020 · Жалоба 8 часов назад, Harvester сказал: И, кстати, я нигде не говорил про модуль ядра. Название собственной темы забыли? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Harvester 0 7 июля, 2020 Опубликовано 7 июля, 2020 · Жалоба 47 minutes ago, andrew_b said: Название собственной темы забыли? И где там "ядро"? Впрочем, если я неправильно употребил слово "модуль", приношу извинения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 7 июля, 2020 Опубликовано 7 июля, 2020 (изменено) · Жалоба 23 hours ago, Harvester said: Вот, что находится в файле maps: ага, я не правильно понял вашу проблему. У вас out of memory. Покажите вывод ulimit -a Что там в max memory size? 240 чтоли? Изменено 7 июля, 2020 пользователем new123 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jury093 2 7 июля, 2020 Опубликовано 7 июля, 2020 · Жалоба 11 часов назад, Harvester сказал: Для начала я как минимум хочу понять, какая взаимосвязь между областью [heap] и динамически выделяемыми буферами. а вы для разнообразия приведите на какой архитектуре запускаете, как память запрашиваете и вывод лога сегфолта.. в мире линукса есть простейшее правило, чем больше информации при вопросе вы дадите, тем выше вероятность получения ответа.. может у вас срабатывает какой-нить OOM.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться