4

linux下调试内存问题

 3 years ago
source link: https://blog.gotocoding.com/archives/456
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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机器上很大概率崩溃的现象,其实是因为溢出太多导致。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK