Я использую AddressSanitizer из g ++ в своей программе, и есть некоторые выводы, которые я испытываю с трудностями при понимании и действии.
Раньше я использовал g ++ — 4.8.4, и я почти уверен, что отчетов об утечках не было, но недавно я перешел на g ++ — 5.2.1, и теперь у меня есть новые отчеты об ошибках. Я думаю, GCC5 стало лучше.
Однако некоторые из них довольно загадочны, например:
== 8192 == ОШИБКА: LeakSanitizer: обнаружены утечки памяти
Прямая утечка 6960 байтов в 174 объектах, выделенных из:
# 0 0x7f4a73eac5b1 в __interceptor_calloc (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x945b1)
# 1 0x7f4a3ccd1d81 (/usr/lib/x86_64-linux-gnu/dri/i965_dri.so+0x27ad81)Прямая утечка 2560 байтов в 4 объектах, выделенных из:
# 0 0x7f4a73eac76a в realloc (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x9476a)
# 1 0x7f4a53c34839 (/usr/lib/x86_64-linux-gnu/libfontconfig.so.1+0x1b839)Прямая утечка 2144 байта (ов) в 57 объектах, выделенных из:
# 0 0x7f4a73eac44a в malloc (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x9444a)
# 1 0x7f4a5f242b7c (/usr/lib/x86_64-linux-gnu/libxcb.so.1+0xbb7c)
Следующий более понятен:
Прямая утечка 512 байтов в 1 объекте, выделенном из:
# 0 0x7f4a73ead1ba в операторе new (без знака long) (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x951ba)
… больше строк, указывающих на проблему в файле и стек вызовов.
Первые три отчета связаны с последним? Если они независимы, есть ли способ найти то, что не так?
Благодарю.
==8192==
: PID
Direct leak of 6960 byte(s)
: общая утечка памяти для этого отчета
in 174 object(s)
: количество отдельных распределений, которые совместно используют одну и ту же трассировку стека (или часть трассировки стека) (может быть выделением в цикле)
from: #0 [...]
: трассировка стека.
Это для глупого объяснения того, что здесь.
То, что вы можете знать, это: все, что вы просочились, кажется, в i965_dri.so
графический драйвер Intel для пользователей Linux и другие общие объекты X.org. В этом случае утечка может происходить из вашего кода, если вы не освобождаете некоторые ресурсы openGL / GLX, или LeakSanitizer считает это утечкой, а вместо этого управляет драйвером intel (возможно, как кеш или пул распределения).
Первое, что я хотел бы найти, — это ресурсы openGL, которые все еще активны в конце программы и освобождают их. Если вы используете рендер или библиотеки, такие как Qt / …, он может сохранять некоторые ресурсы выделенными.
Вы правильно закрываете выделенное окно, освобождаете курсор, …?
Других решений пока нет …