URN Logo
UNIX Resources » Linux » China Linux Forum » C/C++编程版 » 12 » 用valgrind检查程序中的内存泄露情况问题?
announcement 声明: 本页内容为中国Linux论坛的内容镜像,文章的版权以及其他所有的相关权利属于中国Linux论坛和相应文章的作者,如果转载,请注明文章来源及相关版权信息。
Resources
China Linux Forum(finished)
Linux Forum(finished)
FreeBSD China(finished)
linuxforum.net
  业界新闻与评论
  自由软件杂谈
  IT 人生
  Linux软件快递
  翻译作坊
  Linux图书与评论
  GNU Emacs/XEmacs
  Linux 中文环境和中文化
  Linux桌面与办公软件
  Linux 多媒体与娱乐版
  自由之窗Mozilla
  笔记本电脑上的Linux
  Gentoo
  Debian 一族
  网络管理技术
  Linux 安装与入门
  WEB服务器和FTP服务器
  域名服务器和邮件服务器
  Linux防火墙和代理服务器应用
  文件及打印服务器
  技术培训与认证
  Linux内核技术
  Linux 嵌入技术
  Linux设备驱动程序
  Linux 集群技术
  LINUX平台数据库
  系统和网络安全
  CPU 与 编译器
  系统计算研究所专栏
  Linux下的GUI软件开发
  C/C++编程版
  PHP 技 术
  Java&jsp技术
  Shell编程技术
  Perl 编 程
  Python 编 程
  XML/Web Service 技术
  永远的Unix
  FreeBSD世界
   
用valgrind检查程序中的内存泄露情况问题?
 
 
 
 
 
 
 
 
Subject: 用valgrind检查程序中的内存泄露情况问题?
Author: pingzhenyu    Posted: 2006-08-21 13:19    Length: 2,886 byte(s)
[Original] [Print] [Top]
我想用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");
}
运行日志如下:
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

[Original] [Print] [Top]
Subject: Re: 用valgrind检查程序中的内存泄露情况问题?
Author: pingzhenyu    Posted: 2006-08-21 13:53    Length: 420 byte(s)
[Original] [Print] [Top]
晕,没有人回答。
发送到地址: valgrind-users@lists.sourceforge.net ,信退了回来。免费邮箱不能用。
苦闷!

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

看了半天文档,也没有提到这个问题啊。
[Original] [Print] [Top]
Subject: Re: 用valgrind检查程序中的内存泄露情况问题?
Author: drangon_zhou    Posted: 2006-08-21 13:54    Length: 254 byte(s)
[Original] [Print] [Top]
检查select()、read()、recv()等函数的返回值,valgrind可能会打断用户系统调用,
从而使这些系统调用返回-1,errno可能是EINTR等值。
就算不用valgrind,这种情况也是会出现的,只不过概率低很多,但只要会出现的情况,
程序中都需要考虑处理。
----
岂有豪情似旧时,花开花落两由之。
[Original] [Print] [Top]
Subject: Re: 用valgrind检查程序中的内存泄露情况问题?
Author: pingzhenyu    Posted: 2006-08-21 14:10    Length: 570 byte(s)
[Original] [Print] [Top]
我当然检查了
问题是一直不断的出现这个无效的数据。程序根本无法正常运行。
肯定不是需要检查错误的问题。
问题是为什么会出现这个错误,如何避免。

len = read(fd, cmdBufP->rBuf + cmdBufP->rBufLen,
CMD_RD_BUF_MAX_LEN - cmdBufP->rBufLen);


if ( len> 0)
{

}
else
{
LOGGER_ERROR(loggerP, "tcp recv data is error !");
shutdownFd(fd);
}
[Original] [Print] [Top]
Subject: Re: 用valgrind检查程序中的内存泄露情况问题?
Author: pingzhenyu    Posted: 2006-08-21 14:23    Length: 1,194 byte(s)
[Original] [Print] [Top]
socket监听:

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;
[Original] [Print] [Top]
Subject: Re: 用valgrind检查程序中的内存泄露情况问题?
Author: pingzhenyu    Posted: 2006-08-21 14:47    Length: 1,869 byte(s)
[Original] [Print] [Top]
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
[Original] [Print] [Top]
Subject: Re: 用valgrind检查程序中的内存泄露情况问题?
Author: pingzhenyu    Posted: 2006-08-21 21:54    Length: 82 byte(s)
[Original] [Print] [Top]
晕死,等了一天,没有一个人答复的。哎苦闷阿
可以msn与我联系pingzy@21cn.com
[Original] [Print] [Top]
Subject: Re: 用valgrind检查程序中的内存泄露情况问题?
Author: lennonping    Posted: 2006-09-08 23:07    Length: 112 byte(s)
[Original] [Print] [Top]
革命靠自己,是我程序其他部分影响了他,有自己作了一个定时器影响了,为什么不知道。
靠,高手都潜水了,郁闷
[Original] [Print] [Top]
« Previous thread
预处理能不能计算常数的后缀0个数
C/C++编程版
12
Next thread »
GDB 和虚拟机
     

Copyright © 2007 UNIX Resources Network, All Rights Reserved.      About URN | Privacy & Legal | Help | Contact us
备案序号: 京ICP备05006143    webmaster: webmaster@unixresources.net
This page created on 2008-07-17 03:52:01, cost 0.044369220733643 ms.