了解 LeakSanitizer 输出
Understanding LeakSanitizer outputs
我在我的程序中使用了 g++ 中的 AddressSanitizer,但有些输出我无法理解和采取行动。
我之前使用的是 g++-4.8.4,我很确定没有泄漏报告,但我最近切换到 g++-5.2.1,现在我有新的错误报告。我想 gcc5 变得更好了。
然而,其中一些非常神秘,例如:
==8192==ERROR: LeakSanitizer: detected memory leaks
Direct leak of 6960 byte(s) in 174 object(s) allocated from:
#0 0x7f4a73eac5b1 in __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)
Direct leak of 2560 byte(s) in 4 object(s) allocated from:
#0 0x7f4a73eac76a in realloc (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x9476a)
#1 0x7f4a53c34839 (/usr/lib/x86_64-linux-gnu/libfontconfig.so.1+0x1b839)
Direct leak of 2144 byte(s) in 57 object(s) allocated from:
#0 0x7f4a73eac44a in malloc (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x9444a)
#1 0x7f4a5f242b7c (/usr/lib/x86_64-linux-gnu/libxcb.so.1+0xbb7c)
下一个更清楚:
Direct leak of 512 byte(s) in 1 object(s) allocated from:
#0 0x7f4a73ead1ba in operator new(unsigned long) (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x951ba)
... more lines pinpointing the issue in a file and the call stack.
前三份报告是否与最后一份相关联?如果它们是独立的,有没有办法找出问题所在?
谢谢。
==8192==
: PID
Direct leak of 6960 byte(s)
: 此报告的总泄漏内存
in 174 object(s)
:共享相同堆栈跟踪(或堆栈跟踪的一部分)的不同分配的数量(可以是循环中的分配)
from: #0 [...]
:堆栈跟踪。
这是对这里内容的愚蠢解释。
您可能想知道的是:您泄露的所有内容似乎都在 i965_dri.so
、Linux 上的英特尔用户态图形驱动程序和其他 X.org 共享对象中。泄漏可能来自您的代码,如果您不释放一些 openGL/GLX 资源,或者被 LeakSanitizer 计为泄漏,而是由英特尔驱动程序管理(可能作为缓存或分配池)。
我要查找的第一件事是在程序结束时仍处于活动状态并释放它们的 openGL 资源。如果您使用渲染器或类似 Qt/... 的库,它可能会保留一些资源分配。
您是否正确关闭分配的 window、释放游标、...?
我在我的程序中使用了 g++ 中的 AddressSanitizer,但有些输出我无法理解和采取行动。
我之前使用的是 g++-4.8.4,我很确定没有泄漏报告,但我最近切换到 g++-5.2.1,现在我有新的错误报告。我想 gcc5 变得更好了。
然而,其中一些非常神秘,例如:
==8192==ERROR: LeakSanitizer: detected memory leaks
Direct leak of 6960 byte(s) in 174 object(s) allocated from:
#0 0x7f4a73eac5b1 in __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)
Direct leak of 2560 byte(s) in 4 object(s) allocated from:
#0 0x7f4a73eac76a in realloc (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x9476a)
#1 0x7f4a53c34839 (/usr/lib/x86_64-linux-gnu/libfontconfig.so.1+0x1b839)
Direct leak of 2144 byte(s) in 57 object(s) allocated from:
#0 0x7f4a73eac44a in malloc (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x9444a)
#1 0x7f4a5f242b7c (/usr/lib/x86_64-linux-gnu/libxcb.so.1+0xbb7c)
下一个更清楚:
Direct leak of 512 byte(s) in 1 object(s) allocated from:
#0 0x7f4a73ead1ba in operator new(unsigned long) (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x951ba)
... more lines pinpointing the issue in a file and the call stack.
前三份报告是否与最后一份相关联?如果它们是独立的,有没有办法找出问题所在?
谢谢。
==8192==
: PID
Direct leak of 6960 byte(s)
: 此报告的总泄漏内存
in 174 object(s)
:共享相同堆栈跟踪(或堆栈跟踪的一部分)的不同分配的数量(可以是循环中的分配)
from: #0 [...]
:堆栈跟踪。
这是对这里内容的愚蠢解释。
您可能想知道的是:您泄露的所有内容似乎都在 i965_dri.so
、Linux 上的英特尔用户态图形驱动程序和其他 X.org 共享对象中。泄漏可能来自您的代码,如果您不释放一些 openGL/GLX 资源,或者被 LeakSanitizer 计为泄漏,而是由英特尔驱动程序管理(可能作为缓存或分配池)。
我要查找的第一件事是在程序结束时仍处于活动状态并释放它们的 openGL 资源。如果您使用渲染器或类似 Qt/... 的库,它可能会保留一些资源分配。
您是否正确关闭分配的 window、释放游标、...?