首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >解释C++/SDL2程序的valgrind输出

解释C++/SDL2程序的valgrind输出
EN

Stack Overflow用户
提问于 2015-04-18 22:48:25
回答 1查看 609关注 0票数 0

嗨,有人能解释一下这个valgrind输出是什么意思吗?我应该怎么解决这个问题??我现在发布的输出是实际终端输出的一部分。其余的也是相似的,并且列出了大部分相同的错误。

这是一个使用SDL2的C++程序。

相关的代码真的很长,所以我会在评论中添加任何要求。

这是由于某些SDL_Surface*造成的吗?但在从main()返回之前,我确保释放了所有这些函数。另外,我的SDL_Window*是全局的。这会不会造成问题。

此输出导致仅在Ubuntu而不是Mac OSX中出现的段错误!!我知道MAC上的Xcode会初始化未初始化的变量并继续执行,但这在Ubuntu中不会发生。但是valgrind输出不会显示任何uninit变量,即使memcheck工具中的trace-origins = yes也是如此。

另外,我没有任何名为call_init or_dl_init或dl_open_worker的函数!

代码语言:javascript
运行
复制
==17744== 402 bytes in 7 blocks are possibly lost in loss record 506 of 630
==17744==    at 0x4C2CC90: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==17744==    by 0xD3A56A1: ??? (in /usr/lib/x86_64-linux-gnu/dri/i965_dri.so)
==17744==    by 0xD3A5944: ??? (in /usr/lib/x86_64-linux-gnu/dri/i965_dri.so)
==17744==    by 0xD3965C5: ??? (in /usr/lib/x86_64-linux-gnu/dri/i965_dri.so)
==17744==    by 0xD152EAF: ??? (in /usr/lib/x86_64-linux-gnu/dri/i965_dri.so)
==17744==    by 0x4010139: call_init.part.0 (dl-init.c:78)
==17744==    by 0x4010222: call_init (dl-init.c:36)
==17744==    by 0x4010222: _dl_init (dl-init.c:126)
==17744==    by 0x4014C6D: dl_open_worker (dl-open.c:577)
==17744==    by 0x400FFF3: _dl_catch_error (dl-error.c:187)
==17744==    by 0x40143AA: _dl_open (dl-open.c:661)
==17744==    by 0x601E02A: dlopen_doit (dlopen.c:66)
==17744==    by 0x400FFF3: _dl_catch_error (dl-error.c:187)
==17744== 512 bytes in 1 blocks are possibly lost in loss record 519 of 630
==17744==    at 0x4C2CC90: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==17744==    by 0xD3D3689: ??? (in /usr/lib/x86_64-linux-gnu/dri/i965_dri.so)
==17744==    by 0xD412E86: ??? (in /usr/lib/x86_64-linux-gnu/dri/i965_dri.so)
==17744==    by 0xD3D1288: ??? (in /usr/lib/x86_64-linux-gnu/dri/i965_dri.so)
==17744==    by 0xB198E60: ??? (in /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1.2.0)
==17744==    by 0xB16D9D3: ??? (in /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1.2.0)
==17744==    by 0xB16A0BA: ??? (in /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1.2.0)
==17744==    by 0xB16A932: glXChooseVisual (in /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1.2.0)
==17744==    by 0x4EEDD9E: ??? (in /usr/lib/x86_64-linux-gnu/libSDL2-2.0.so.0.2.0)
==17744==    by 0x4EEDFD0: ??? (in /usr/lib/x86_64-linux-gnu/libSDL2-2.0.so.0.2.0)
==17744==    by 0x4EE2BE5: ??? (in /usr/lib/x86_64-linux-gnu/libSDL2-2.0.so.0.2.0)
==17744==    by 0x4EE477B: ??? (in /usr/lib/x86_64-linux-gnu/libSDL2-2.0.so.0.2.0)
==17744== 

==17744== 
==17744== LEAK SUMMARY:
==17744==    definitely lost: 73,806 bytes in 8 blocks
==17744==    indirectly lost: 0 bytes in 0 blocks
==17744==      possibly lost: 1,962,378 bytes in 4,720 blocks
==17744==    still reachable: 2,908,902 bytes in 5,710 blocks
==17744==         suppressed: 0 bytes in 0 blocks
==17744== Reachable blocks (those to which a pointer was found) are not shown.
==17744== To see them, rerun with: --leak-check=full --show-leak-kinds=all
==17744== 
==17744== For counts of detected and suppressed errors, rerun with: -v
==17744== ERROR SUMMARY: 194 errors from 186 contexts (suppressed: 5 from 1)
EN

回答 1

Stack Overflow用户

发布于 2015-04-18 23:37:47

如果不知道程序,Valgrind输出是完全没有意义的。例如,您可以选择全局分配某些内容,并且永远不会删除它,甚至在关机时也不删除。它不会有任何伤害,但Valgrind将警告您泄漏,因为这是正式的。但是,所有这些都不会导致任何分段错误,而且您对输出导致分段错误的解释也非常值得怀疑。

现在,关于dl_*函数,这些函数来自Linux上的动态加载器,所以很可能不是您引起的。它们可能是一些可以忽略的东西,您可以尝试通过将程序剥离到您确信代码不会导致任何问题的程度来重现它们。

对于全局,这也无关紧要,因为原始指针没有任何析构函数。然而,如果你不释放它所代表的资源,Valgrind会将其报告为错误。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29718832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档