Поиск места размещения для двойных бесплатных ошибок (с valgrind) - PullRequest
6 голосов
/ 14 апреля 2011

Учитывая ошибку двойного освобождения (сообщенную valgrind), есть ли способ узнать, где была выделена память? Valgrind сообщает мне только местоположение сайта освобождения (то есть вызов free()), но я хотел бы знать, где была выделена память .

Ответы [ 2 ]

9 голосов
/ 31 марта 2015

Чтобы Valgrind отслеживал следы стека выделения, вы должны использовать опции:

--track-origins=yes --keep-stacktraces=alloc-and-free

Valgrind сообщит о стеке выделения в разделе Block was alloc'd at сразу после Address ... inside a block of size x free'd alert.

В случае, если ваше приложение велико, опции --error-limit=no --num-callers=40 также могут быть полезны.

0 голосов
/ 19 сентября 2018

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

Лучший способ проверить это - применить советподробности в ответах: Как отследить ошибку двойного освобождения или повреждения в C ++ с помощью gdb .

Прежде всего, вы можете попробовать скомпилировать вашу программу с флагами fsanitize=address -g.Это обеспечит память программы во время выполнения для отслеживания всех выделений, обнаружения переполнений и т. Д.

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

...