linux下调试内存问题

因为linux下没有QQ,刚好我的mac mini在闲置, 于是尝试着在OSX下开发silly

令人奇怪的是在我的linux机器下运行好好的程序, 在osx下只要client对着silly发送几个数据包就会导致silly直接崩溃, 调试半夜未果。

今天早上在地铁上我都甚至开始怀疑osx下的malloc库默认不是线程安全的, 但是地铁上查了一路依然不能确定。

到了公司后, info程序员还没到,我就又寻思着我那个bug, 在centos下又测了一次,依然无果。

不死心看了一下’男人’对malloc怎么说, 无意间看到linux下有一个环境变量叫MALLOC_CHECK_, 可以为下面的值:

0 – 不产生错误信息,也不中止这个程序
1 – 产生错误信息,但是不中止这个程序
2 – 不产生错误信息,但是中止这个程序
3 – 产生错误信息,并中止这个程序

在终端下执行了export MALLOC_CHECK_=1, 然后再次启动silly, 当客户端连接时silly直接报错, 终于找到根源所在。

犯了个低级错误,在向worker发消息会首先使用malloc分配silly_message结构体所占用的空间, 然后再分配silly_socket_message所占用的空间, 在分配silly_socket_message所占的内存空间时我本意是要使用sizeof(*socket)来计算需要使用的内存大小(socket为一个struct silly_socket_message结构体的指针),却因为手误打成了sizeof(socket)。这实际上才分配了8个字节(64位机器),所有针对这地内存的操作实际上都是溢出行为。

由于64位机器上的指针长度要比32位机器上的指针大一倍, struct silly_socket_message仅仅才16个字节,那么在64位机器上溢出的程度要小于32位机器,这也解释了当初没有在意的silly在清风同学的32位VPS机器上很大概率崩溃的现象,其实是因为溢出太多导致。

《linux下调试内存问题》有一个想法

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

49 − = forty