技术问题--cesocket接受数据时,出现内存泄漏!--200分

crazyeagle 2006-06-22 02:47:53
arm + ce4.2 + evc
我的程序中网络用的是CCeSocket,接受用的是OnReceive();在OnReceive中如果不做Receive()的话,当有数据来的话,则ce的物理内存持续增长,直至出现out-of-memory的错误而当机。我做了Receive(),并在其中做了协议解析。当小数据时程序会正常运行。当我用稍大一点的数据(256bytes)连续给wince发数据的话(10000次),wince就会出现内存泄漏(物理内存持续增长),有时吃掉几M内存后停下来,有时出现out-of-memory的错误而当机。
我的ce设备没有同步,所以不能在线调试,而模拟器上又无此现象,所以找不出问题的原因在哪里?不知大家有没有遇到过此类情况。另谁有能在线调试的机器,帮忙调一下,找出问题的原因在哪里。在这里谢谢大家先了!!!!!!
...全文
421 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Helianthus 2006-06-28
  • 打赏
  • 举报
回复
从你描述的问题来看,主要原因不外乎两个:
1.代码造成的硬性内存泄漏
2.由于任务优先级别造成的问题(大量数据堆积在底层得不到及时处理从而导致大量内存无法回收重新使用,等效于隐性的逻辑内存泄漏)

因此,对你来说,可以自己动手来查明具体是哪一个原因。首先,对于第一个可能,你只要自己对系统的内存操作函数malloc/free完成重定向(直接采用malloc/free首地址指令替换复杂一些而且还要自己构造回来的堆栈结构;如果有所有的源码倒不如可以使用简单一些的预编译方式的来得简单实用),实现一个自己简单的封装管理函数就可以看到内存被哪一个文件的哪一行malloc分配的,为什么没有被释放。

如果没有发现任何代码内存泄漏,就开始检查是否存在逻辑内存泄漏。在OS的Task_ContextSwitch(或者类似的调度函数上)做简单的TRACE
(直接看任务的定义优先级别表也行),
看一下你关注的几个任务(数据接受/数据处理等核心部分)在每一个数据处理周期
内各自占用了多少处理时间,数据接收和处理流量是否均衡。一个稳健的系统应该是
数据出口速率远大于进口数据,否则必然造成数据堆积,最后一个是内存被耗尽。

Helianthus
2006/06/28
shmily1280 2006-06-27
  • 打赏
  • 举报
回复
应该不会是SOCKET的问题,研华一个工程师做过,一秒对20000个节点扫描40次的操作(16个线程),而且没问题.
crazyeagle 2006-06-27
  • 打赏
  • 举报
回复
数据堆积,不知道是在哪里堆积的,底层驱动?cesocket?CAsyncSocket?

版主,请帮忙支支招!!!
shmily1280 2006-06-27
  • 打赏
  • 举报
回复
我猜测可能用的是TCP.因为他们提供的例子程序中的调用到的DLL名为:ADAMTCPCE.DLL
(寒自己猜想的依据...)
shmily1280 2006-06-27
  • 打赏
  • 举报
回复
抱歉,是10000个数据点.
数据接收方式,你的意思是他们用TCP还是UDP吧?(这个偶就不清楚了)
shmily1280 2006-06-27
  • 打赏
  • 举报
回复
1刚刚看了下,他们用的是API.
2.对于网络编程我不熟,接收数据方式?不明白,
3.他们用的是100M的以太网卡,据那个开发的工程师说用的带宽大概8M左右(完成功能)
crazyeagle 2006-06-27
  • 打赏
  • 举报
回复
to shmily1280(锄禾)
1、研华的工程师用的是ccesocket还是csocket还是api?
2、接受数据分方式是何种形式?
3、处理速度是多少?
我做了个简单的测试,采用ccesocket,在接受里不做Receive();服务器只须发一条数据,就能把ce搞瘫痪。
Helianthus 2006-06-23
  • 打赏
  • 举报
回复
同意big_foot_cnd的看法。
你可以检查一下读取数据的任务的执行优先级别。如果优先级别较低,就会导致大量的数据堆积在底层的协议层中。数据流量小时,效果还不明显;当数据量大时,由于数据大量堆积将占用很多内存,而同时内存的回收一般是在数据处理之后,由于得不到及时处理,所以出问题。
bigfoot_cnd 2006-06-23
  • 打赏
  • 举报
回复
没接触过,只是猜一下:

CCeSocket应该是从底层把数据读到一个队列中,可能是动态增长的。
Receive()方法从队列中把数据读走。如果没有读走的话,队列就一直增长。
256byte x 10,000 会吃掉几兆内存。

楼主仔细读一下 CCeSocket的使用,可能可以设置最大使用内存之类的,可以覆盖掉原先读出来的数据。
一把吉他 2006-06-23
  • 打赏
  • 举报
回复
不懂,关注
flyprogrammer 2006-06-23
  • 打赏
  • 举报
回复
有可能是,但是不是你发送数据时候出现的内存泄露呢?
crazyeagle 2006-06-23
  • 打赏
  • 举报
回复
这是不是CCeSocket固有的bug??
如何解除这个bug,不知各位有何高见?
yajyjy 2006-06-23
  • 打赏
  • 举报
回复
接收数据和发送数据的速度应该基本保持一致,免得数据堆积
jun_01 2006-06-22
  • 打赏
  • 举报
回复
难就难在不能调试
Eddie005 2006-06-22
  • 打赏
  • 举报
回复
路过顶~

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧