Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

解析大pcap文件,内存消耗大 #2

Open
muse117 opened this issue Sep 6, 2020 · 6 comments
Open

解析大pcap文件,内存消耗大 #2

muse117 opened this issue Sep 6, 2020 · 6 comments
Labels

Comments

@muse117
Copy link

muse117 commented Sep 6, 2020

您好,我对您这个项目很兴趣,于是下载测试了一下离线解析pcap文件,我在debug模式下,加载了600多M的pcap文件,内存消耗在1G,占用率比较大,解析20多G的pcap文件,程序会崩溃。
微信图片_20200906152111

@Chentingz
Copy link
Owner

您好,感谢您关注这个项目,并反馈程序的问题。

我看了下源码,目前程序中以下地方可能存在内存泄漏:
(1)DNS解析部分(如printDNSQuery()at SnifferUIDlg.cpp),malloc后没有free
(2)界面打印部分(如printListCtrlPacketList()at SnifferUIDlg.cpp),大量使用CString存取字符串,字符串过长或用CString&传参时可能出现内存泄漏[1][2]
以上是我认为导致读取大pcap文件时内存占用率高甚至出现程序崩溃的原因。

未来有时间的话会修复这个问题的:)

参考
[1]CString用不好,真的是有内存泄露的
[2]CString内存泄露的解决办法

@Chentingz Chentingz added the bug label Sep 13, 2020
@muse117
Copy link
Author

muse117 commented Sep 13, 2020

您好,感谢您关注这个项目,并反馈程序的问题。

我看了下源码,目前程序中以下地方可能存在内存泄漏:
(1)DNS解析部分(如printDNSQuery()at SnifferUIDlg.cpp),malloc后没有free
(2)界面打印部分(如printListCtrlPacketList()at SnifferUIDlg.cpp),大量使用CString存取字符串,字符串过长或用CString&传参时可能出现内存泄漏[1][2]
以上是我认为导致读取大pcap文件时内存占用率高甚至出现程序崩溃的原因。

未来有时间的话会修复这个问题的:)

参考
[1]CString用不好,真的是有内存泄露的
[2]CString内存泄露的解决办法

解析大pcap文件是一个难题吧,用wireshark加载程序也会崩溃,因为无法把所有包都加载,只能加载一部分包,可以边解析边加载,我不知道您有没有用过科来的网络分析软件回放功能,就这样做的,可以支持大pcap文件解析分析,最后显示包的内容是最后加载一部分的,大概就几十M。

@Chentingz
Copy link
Owner

我试了一下您说的科来软件,它是用了一个Buffer来缓存捕获/文件加载的数据包,通过设置Buffer的大小来限制数据包显示的数量,从而减少大量的内存消耗。
相比我这种简单粗暴的将pcap文件中所有数据包加载到内存里面,这个方法明显更好,后续程序会按照这个思路进行改进,谢谢您。

@muse117
Copy link
Author

muse117 commented Sep 21, 2020

我试了一下您说的科来软件,它是用了一个Buffer来缓存捕获/文件加载的数据包,通过设置Buffer的大小来限制数据包显示的数量,从而减少大量的内存消耗。
相比我这种简单粗暴的将pcap文件中所有数据包加载到内存里面,这个方法明显更好,后续程序会按照这个思路进行改进,谢谢您。

是的,您这种做法是跟wireshark做法是一样的,wireshark是把每个元数据包的一部分信息存储在内存是为了做统计分析(回话、协议等等),他们这么做是为了保证可以看到每一个数据包内部的各种数据信息,但无法解决内存溢出的问题。
科来是把重点放在了统计分析上,所以,他们是边加载pcap,边进行统计分析(回话、协议)。
所以,要看您把软件设计的重心放在哪里

@zhanghl-coding
Copy link

抱歉,抓包工具轻度用户,假设对于一个报文的呈现上,应该是元信息的展示与点开后本包的详细信息,似乎只能做个内存池,然后保留一部分数据在内存,然后换入换出了吧,换入换出上再加上一点预取。

@Chentingz
Copy link
Owner

是的

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants