我有客户端/服务器应用程序。通过Boost.Asio实现交互。
我创建了单元测试来检查长时间运行的数据传输。 在测试期间检测到内存泄漏。 任务管理器告诉我内存使用量不断增长 - 每10分钟高达35MB。测试结束时生成的报告包含:
Result StandardError: Detected memory leaks!
Dumping objects ->
{14522} normal block at 0x00E8ADC0, 16 bytes long.
Data: < _M} Y > B0 5F 4D 7D F9 59 F2 02 F4 E9 E6 00 CC CC CC CC
{14012} normal block at 0x00E8B280, 16 bytes long.
Data: < v > C0 76 A4 00 94 01 00 00 98 01 00 00 F0 D2 E3 00
{14011} normal block at 0x00E74B38, 12 bytes long.
Data: < > 00 00 00 00 9C 01 00 00 98 01 00 00
{14007} normal block at 0x00E745F8, 8 bytes long.
Data: < L > E0 4C E5 00 00 00 00 00
{14006} normal block at 0x00E54CB8, 60 bytes long.
Data: < v 4 > E4 76 A4 00 D0 D3 B0 00 00 00 00 00 34 80 E3 00
{13724} normal block at 0x00E710F8, 385 bytes long.
Data: < > 03 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00
{13722} normal block at 0x00E85C58, 28 bytes long.
Data: < F _ _ > F2 B6 46 00 B4 5F E3 00 A0 5F E3 00 BC 96 E7 00
{13720} normal block at 0x00E6F9B8, 80 bytes long.
Data: <wxF > 77 78 46 00 FC FF FF FF 00 00 00 00 CC CC CC CC
{13700} normal block at 0x00E6DFD0, 88 bytes long.
Data: < > C8 A4 A4 00 01 00 00 00 01 00 00 00 00 00 00 00
…
Data: <` X L > 60 8E E0 00 58 17 E2 00 CD 4C F7 EA
{153} normal block at 0x00DF0070, 12 bytes long.
Data: <` kf > 60 8D E0 00 98 00 E2 00 15 6B 66 0E
{151} normal block at 0x00DF0038, 12 bytes long.
Data: < .g> 20 86 E0 00 E0 FC E1 00 9D B7 2E 67
{149} normal block at 0x00DF0658, 12 bytes long.
Data: < G > A0 89 E0 00 00 00 00 00 47 01 D5 11
{147} normal block at 0x00DF0268, 12 bytes long.
Data: <` > 60 84 E0 00 A8 F5 E1 00 ED 8C AA BA
{145} normal block at 0x00DF0230, 12 bytes long.
Data: < ' " > 20 84 E0 00 00 11 E2 00 27 B0 22 00
{143} normal block at 0x00DF0690, 12 bytes long.
Data: <` P KnOQ> 60 88 E0 00 50 04 E2 00 4B 6E 4F 51
{141} normal block at 0x00DF0540, 12 bytes long.
Data: <` > 7> 60 82 E0 00 00 0A E2 00 3E 0D 9E 37
{139} normal block at 0x00DF0620, 12 bytes long.
Data: <Pq 1 > 50 71 DF 00 00 00 00 00 E5 DD 31 B5
{137} normal block at 0x00DF0700, 12 bytes long.
Data: < q @ #> 10 71 DF 00 40 FA E1 00 14 8B 0D 23
{134} normal block at 0x00DF5CE0, 96 bytes long.
Data: <h BV BV > 68 19 E0 00 D0 42 56 00 E0 42 56 00 88 00 00 00
{133} normal block at 0x00DF0188, 8 bytes long.
Data: < \ > A0 5C DF 00 00 00 00 00
{132} normal block at 0x00DF5CA0, 16 bytes long.
Data: < > 88 01 DF 00 D8 AA DF 00 20 AC DF 00 20 AC DF 00
Object dump complete.
我尝试通过boost --detect_memory_leaks="allocation number"
将断点提供给提到的内存分配,并在调试模式_crtBreakAlloc = 1000
的Watch窗口中进行设置。这是行不通的。也许是因为泄漏不在我的代码中,而是在boost / OpenSSL代码中出现?
我无法确定泄漏发生的位置。我该怎么办?
Windows 8,Visual Studio 2015,提升1.60,OpenSSL 1.0.2g
答案 0 :(得分:0)
查看this post以查看有关在Windows下处理内存泄漏的一些建议提示。向下滚动,不要只看第一个答案。特别值得考虑的是第二个答案讨论的DEBUG_NEW基于宏的解决方案。鉴于提升asio主要是仅限标题,即使违规分配来自升级库,这也可以帮助您。
答案 1 :(得分:0)
第1部分:Visual Studio关于内存泄漏的报告
我正在使用Boost.Asio通过TLS与服务器通信,即Boost.Asio使用OpenSSL。
似乎OpenSSL初始化自己并且在应用程序结束之前不清理内存(因为应用程序关闭并且内存将被释放)。 这不是一大块内存(我不知道如何测量它)。
结果Visual Studio将该内存视为泄漏。但事实并非如此。
(这是我的假设,也许这种报道的真正原因是其他的。但我没有看到任何其他可能的原因。)
第2部分:
在上面的问题中,我问了几十Mb的内存泄漏。这是我的错误代码导致巨大的内存缓冲区))。
巨大的内存消耗和VisualStudio关于内存泄漏的报告让我相信smth是非常错误的))
缓冲区很容易缩小到更小的尺寸。