LINUX.ORG.RU

Отладить утечку памяти на стыке Python и бинарной программы

 , modelsim, ,


1

2

Использую фреймворк Cocotb для написания тестовых окружений для HDL-проектов. Симулятор Modelsim Altera Starter Edition (бесплатный). При использовании симулятора IcarusVerilog+Python3+Cocotb потребление памяти в норме, однако в связке Modelsim+Python3+Cocotb наблюдается лютая утечка памяти. Связь через VPI интерфейс.

Как отладить утечку памяти в такой связке? Причем Python часть я смотрел при помощи dowser профилировщика памяти и там всё в норме, вероятно. Отсюда делаю вывод что течет сам Modelsim в такой связке, что-то работает или используется не так (код не мой). Либо течет в коде, который связывает Python + VPI, который при запуске компилируется в библиотеку *.so

Чистые тесты на System Verilog не приводят к потере памяти на Modelsim.

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

Но больше я подозреваю именно библиотеку, которая формируется для связки VPI + Python из состава Cocotb. Можно ли как-то отладить проблемы памяти тогда, если у основной программы нет отладочных символов, а у библиотеки, которую она загружает динамически - такие символы есть?

★★★★★

Последнее исправление: I-Love-Microsoft (всего исправлений: 4)

Как выяснил, что там утечка?

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

Да, но как оно в связке с modelsim - хз. Коллега как-то по-другому симуляцию прикручивает, емнип.

UVV ★★★★★
()
Ответ на: комментарий от UVV

Когда у меня пару раз комп повис из за лютого своппинга :) Да видно что память кушается всё больше и больше процессом симулятора. Утечка - считаю что факт. В сравнении с IcarusVerilog, где нет утечки даже после длителного времени работы.

Что использует коллега? SystemC? Или С/С++ связку?

I-Love-Microsoft ★★★★★
() автор топика
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
Ответ на: комментарий от UVV

Нету. Да не обязательно. Мне главное как эту проблему отлаживать. Программу свою знаю как отладить valgrind-ом, но когда чужая программа как библиотека, да еще цепляется к другой большой бинарной блобине...

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

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

ты можешь отладчиком к ней прицепиться и поставить breakpoint в своём коде. Я так делал, работает. Другое дело, что утечка может быть не в твоём коде. Да и описанное поведение не факт что утечка, может попасть в бесконченый цикл, либо просто не успевать обрабатывать идущий объём данных.

UVV ★★★★★
()
Ответ на: комментарий от UVV

Да и описанное поведение не факт что утечка, может попасть в бесконченый цикл, либо просто не успевать обрабатывать идущий объём данных.

Бесконечный цикл - я бы увидел зависание. Если бы циклы плодились - я бы увидел ускорение потребления памяти. Обработка там последовательная, нет такой необходимости успеть - всё работает по мере обработки, не по таймаутам.

Хорошо, так можно подцепиться отладчиком к чему? К программе? Или к библиотеке? Просто она загружается уже после старта основной программы, динамически. Как такое настроить я не очень понимаю, хотя бы в GDB.

I-Love-Microsoft ★★★★★
() автор топика

Valgrind? Только нужен питон с включенной поддержкой valgrind-a. На обычном питоне будет много лишнего мусора в логах.

cvv ★★★★★
()
Ответ на: комментарий от cvv

Боюсь что valgrind --quiet --trace-children=yes вообще не может заглотить такую программу как vsim из состава Modelsim. Подозреваю что они сделали защиту какую-то от яумамыхацкеров. Программа падает, отладить невозможно.

Что же еще можно предпринять?

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от UVV

Смотрю на всяческие либы типа mtrace, Electric Fence, Dmalloc и другие. Но они для программ. Как применить их для библиотек, когда нужно им явно сказать «программа завершена, смотри что не подтерли».

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

glibc имеет встроенную поддержку отлова утечек. Если проэкспортить правильную переменную то все malloc()/free()/... начнут логгироватся в файл

cvv ★★★★★
()
Ответ на: комментарий от cvv

Огошечки! Не знал. Возможно ли выделение памяти не через malloc/free, есть только эти функции для выделения, т.е. в C++ тоже они в «самом низу» дергаются? Иными словами, на Linux оно будет использовать именно glibc (у меня Ubuntu).

https://stackoverflow.com/a/154419

В любом случае, разберусь. Сама эта подсказка для меня возможно откроет путь для отладки этого опенсорсного проекта.

I-Love-Microsoft ★★★★★
() автор топика
Последнее исправление: I-Love-Microsoft (всего исправлений: 2)
Ответ на: комментарий от I-Love-Microsoft

Возможно ли выделение памяти не через malloc/free,

Впринцыпе есть много способов выделения памяти. По умолчанию питон выделяет другими средствами и это является проблемой для валгринда. Но для тебя это хорошо - в выхлопе mtrace не будет постороннего мусора.

C++ тоже они в «самом низу» дергаются?

В зависимости от версии компилятора и рантайма бывают варианты.

cvv ★★★★★
()
Ответ на: комментарий от cvv

Собрал все библиотеки-плагины проекта Cocotb с отладочными символами, запустил

MALLOC_TRACE=mtrace.out /home/user/modelsim/linux_x86_64/vsim $@

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

Короче говоря, никакого лога так и не вылезло. Подозреваю, дело не только в том что в vsim нет символов, но и в том, что плагины загружаются динамически. Этот инструмент можно сказать их тупо не видит, так еще и не может работать с библиотеками.

Реализовать программу-заглушку для отладки плагинов не представляется возможным, т.к. это сложные протоколы, так еще и проблема может возникать из-за неверных действий в существующей связке, ибо эти же плагины с IcarusVerilog работают без обозначенной проблемы памяти.

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

Ты наверное что-то делаешь нетак.

1. Путь к логу правильней бы сделать абсолютным

2. Возможно нужно слинковатся с отладочной версией glibc

А так - у меня мало опыта с этим инструментом. Многого не подскажу

cvv ★★★★★
()
10 января 2018 г.
Ответ на: комментарий от cvv

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

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

Странно ѣто ...

Кстати, еще сꙋществꙋет такаѧ штꙋка как ASAN. Тоже из ѣтой оперы ...

cvv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.