boost asio

时间:2016-05-26 10:51:48

标签: c++ memory boost memory-leaks boost-asio

我有客户端/服务器应用程序。通过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

2 个答案:

答案 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是非常错误的))

缓冲区很容易缩小到更小的尺寸。