С++ определяет выделение памяти

Я пытаюсь улучшить производительность своей программы на C++ и обнаружил, что преобразование выделений памяти (mallocs) в пул объектов дает отличные результаты. Проблема заключается в обнаружении мест, откуда вызывается malloc, так как кодовая база довольно большая. Я не могу использовать простой gdb с точками останова, потому что параллельно работает много таймеров и обработчиков сигналов.

Есть ли способ в gdb, с помощью которого я могу распечатать всю трассировку стека всякий раз, когда вызывается malloc, без необходимости делать это каждый раз вручную. ИЛИ Можете ли вы предложить какой-либо другой инструмент, который поможет мне сделать то же самое.


person user1918858    schedule 17.07.2016    source источник
comment
Насколько сложно искать строку malloc во всей кодовой базе?   -  person taskinoor    schedule 17.07.2016
comment
Почему вы используете malloc в коде C++? Вы должны использовать новые. В этом случае вы можете определить свои собственные новые операторы   -  person Ed Heal    schedule 17.07.2016
comment
Можете ли вы просто сделать это в GDB? Если он попадает в malloc (или new), вы нашли живой. Если это не так, после 20 или около того выборок он использует так мало времени, что его оптимизация не будет иметь смысла.   -  person Mike Dunlavey    schedule 17.07.2016
comment
@MikeDunlavey он попадет на malloc, потому что новый использует его ... и я полагаю, что пул тоже его использует   -  person Swift - Friday Pie    schedule 16.08.2020


Ответы (2)


Вы можете написать gdb с помощью Python.

Вы также можете реализовать свою собственную функцию malloc и связать ее. Обратный адрес будет в стеке, который даст вам звонящий.

person Átila Neves    schedule 17.07.2016

Набор инструментов valgrind содержит массив, который вы можете использовать именно для этой цели:

valgrind --tool=massif ./mybinary

Это собирает сведения обо всех распределениях, включая трассировки стека, которые вы можете просмотреть после завершения выполнения программы. Дополнительные сведения о выводе см. в документации по массиву: http://valgrind.org/docs/manual/ms-manual.html. Надеюсь, это поможет.

P.S. Также проверьте библиотеку TCMalloc - возможно, она уже делает то, что вы хотите, хотя вы можете сделать лучше в зависимости от вашего конкретного приложения. Лучше всего то, что никаких изменений в исходном коде не требуется — вы просто заменяете функцию malloc из glibc с помощью директивы компоновщика.

person Always Confused    schedule 17.07.2016