注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

老和山小和尚

敬天爱人

 
 
 

日志

 
 
 
 

昨天碰到的一个诡异bug  

2009-09-03 17:45:11|  分类: Nginx |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
这几天在改Nginx源代码的网络层,碰到一个很诡异的bug,找了大半天才搞定。

最初的问题是这样的:某个结构体中的成员变量在函数调用前还可用,但是进入函数函数调用以后,其值就变为空了。

我在想,不会吧,我就一个进程,私有变量,直接就进入函数调用了,不会有什么问题啊。

然后,我把函数成员的地址都打印出来,发现问题了。不会吧,同一个结构体,同一个成员变量,两个地方的指针地址不一样。

一开始我以为是结构体中的宏定义出了问题,搞了半天头文件的宏定义,也没搞定。然后我对同一个结构进行sizeof和offsetof操作,发现两个地方 统计出来的结构不一样!

接着,我照着结构体一个个找,发现问题了,在调用前,off_t是8个字节的,而后者是4个字节的。。。。

我在sys/types.h找到了off_t的定义,它是这样的:
#ifndef __off_t_defined
# ifndef __USE_FILE_OFFSET64
typedef __off_t off_t;
# else
typedef __off64_t off_t;
# endif
# define __off_t_defined
#endif

也就是说,只要定义了__USE_FILE_OFFSET64,off_t就是64位的,而Nginx在ngx_linux_config.h中定义了:
#define _FILE_OFFSET_BITS  64

在features.h中是这样定义的:
#undef  __USE_FILE_OFFSET64
#if defined _FILE_OFFSET_BITS && _FILE_OFFSET_BITS == 64
#define __USE_FILE_OFFSET64    1
#endif
也就是说nginx中off_t是64位的。

而在我写的一个头文件中,我调用了stdint.h文件,它被放在最前面,而且它又调用了features.h,所以造成 __USE_FILE_OFFSET64被undef了,而且它也没有看到_FILE_OFFSET_BITS,所以off_t被声明为32位了。

这次的教训是:除非必要,不要自作主张声明_FILE_OFFSET_BITS这类变量,当然如Igor的高手除外。另外,在Nginx中,尽量不要自己 声明头文件,直接调用Nginx的头文件。



  评论这张
 
阅读(920)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018