51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 2630|回复: 2
打印 上一主题 下一主题

[原创] valgrind检查程序中的内存泄露情况

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2006-8-21 17:00:04 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
我想用valgrind检查程序中的内存泄露情况,可是我程序都没有办法正常运行了!
我用的是异步的socket,为什么socket会收到乱的东西啊?
不用valgrind启动程序时都是正常的。

1、TCP接收数据时,RD_ISSET一直为true,ER_ISSET为true 数据是0。
2、UDP接收数据时,RD_ISSET一直为true,数据长度不为0,但接收到的数据都是0。

系统:
Linux headend1 2.6.8-24-default #1 Wed Oct 6 09:16:23 UTC 2004 i686 i686 i386 GNU/Linux
headend1:/home/he # gcc -v
Using built-in specs.
Target: i686-pc-linux-gnu
Configured with: ./configure
Thread model: posix
gcc version 4.1.0


代码如下:

if (fd > 0 && FD_ISSET(fd,&rd))
      {
         LOGGER_DEBUG(loggerP, "RD_ISSET");
         //have data can be read from fd
         if(fd == emsFd)
                 {
                         int len = read(fd, cmdBufP->rBuf + cmdBufP->rBufLen,
                                  CMD_RD_BUF_MAX_LEN - cmdBufP->rBufLen);
                                  
                                  
if (fd > 0 && FD_ISSET(fd,&er))
      {
         LOGGER_DEBUG(loggerP, "ER_ISSET");
         //have error for specified fd
         char c;
         errno = 0;
         int r = recv(fd, &c, 1, MSG_OOB);
         if ( r < 1 )
         {
            //clear error fd_set
            FD_CLR(fd,&er);
            
            //have really error
            LOGGER_DEBUG(loggerP,"connect to client fd occured problem");
            shutdownFd(fd);
            return;
         }
         else
         {
            //may be have MSG_OOB
            LOGGER_DEBUG(loggerP,"received MSG_OOB");
         }


sock open:
if ( ( s = socket(AF_INET, SOCK_STREAM, 0)) < 0 )
{
//perror("socket");
LOGGER_ERROR(loggerP,"socket failed");
return -1;
}

yes = -1;
if ( setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&yes, sizeof(yes)) < 0 )
{
//perror("setsockopt");
LOGGER_ERROR(loggerP,"setsockopt failed");
close(s);
return -1;
}

memset(&a, 0, sizeof(a));
a.sin_port = htons(listenPort);
a.sin_family = AF_INET;
if ( bind(s, (struct sockaddr *)&a, sizeof(a)) < 0 )
{
//perror("bind");
LOGGER_ERROR(loggerP,"bind failed");
close(s);
return -1;
}

char buf[1024];
sprintf(buf,"accepting connections on port %d", listenPort);
LOGGER_INFO(loggerP,buf);
listen(s, 10);
return s;


运行日志如下:
2:40 [CmdTrsvr] RD_ISSET
2:40 [CmdTrsvr] not received one error frame00000
[CmdTrsvr] buffer data:
                    00 00 00
2:40 [CmdTrsvr] ER_ISSET
2:40 [CmdTrsvr] received MSG_OOB
2:40 [UdpTrsvr] snmp data get:
                    00 00 00 00 00 00 00 00 -- 00 00 00 00 00 00 00 00
                    00 00 00 00 00 00 00 00 -- 00 00 00 00 00 00 00 00
                    00 00 00 00 00 00 00 00 -- 00 00 00 00 00 00 00 00
                    00 00 00 00 00 00 00 00 -- 00 00 00 00 00 00 00 00
                    00 00 00 00 00 00 00 00 -- 00 00 00 00 00 00 00 00
                    00 00 00 00 00 00 00 00 -- 00 00 00 00 00 00 00 00
                    00 00 00 00 00 00


dTrsvr] buffer data:
--4143-- sigvgkill for lwp 4143 tid 1
00 00 00
--4143-- sigvgkill for lwp 4143 tid 1
00 00 00
--4143-- sigvgkill for lwp 4143 tid 1
--4143-- sigvgkill for lwp 4143 tid 1
--4143-- sigvgkill for lwp 4143 tid 1
dTrsvr] ER_ISSET
--4143-- sigvgkill for lwp 4143 tid 1
vr] ER_ISSET
--4143-- sigvgkill for lwp 4143 tid 1
--4143-- sigvgkill for lwp 4143 tid 1
--4143-- sigvgkill for lwp 4143 tid 1
[CmdTrsvr] received MSG_OOB
++4143++ do_setmask: tid = 1 how = 2 (SIG_SETMASK), set = 0xBEFFF39C 0000000000000000
++4143++ oldset=0xBEFFF29C 8000000000000000
--4143-- poll_signals: got signal 64 for thread 1
--4143-- Polling found signal 64 for tid 1
--4143-- signal 64 ignored
--4143-- sigvgkill for lwp 4143 tid 1
--4143-- poll_signals: got signal 64 for thread 1
--4143-- Polling found signal 64 for tid 1
--4143-- signal 64 ignored
++4143++ do_setmask: tid = 1 how = 2 (SIG_SETMASK), set = 0xBEFFF29C 8000000000000000
--4143-- sigvgkill for lwp 4143 tid 1
--4143-- sigvgkill for lwp 4143 tid 1
--4143-- sigvgkill for lwp 4143 tid 1
6:57 [UdpTrsvr] snmp data get:
00 00 00 00 00 00 00 00 -- 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 -- 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 -- 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 -- 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 -- 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 -- 00 00 00 00 00 00 00 00
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

3#
 楼主| 发表于 2006-8-21 21:57:16 | 只看该作者
晕死,等了一天,没有一个人答复的。哎苦闷阿
可以msn与我联系pingzy@21cn.com
回复 支持 反对

使用道具 举报

该用户从未签到

2#
 楼主| 发表于 2006-8-21 18:44:21 | 只看该作者
晕,没有人回答。
发送到地址: valgrind-users@lists.sourceforge.net ,信退了回来。免费邮箱不能用。
苦闷!

那位大侠回答一下啊?
是否我的问题太简单了。
我想valgrind不会有这样的问题啊。要不然怎么用阿,连最简单的socket都不能正常工作?

看了半天文档,也没有提到这个问题啊。

或者有谁有Rational PurifyPlus for Linux and UNIX
为 基于 Linux 和 Unix 的 Java 和 C/C++ 开发提供了分析工具集。
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-17 00:08 , Processed in 0.072710 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表