Friday, March 12, 2010

今天用5分钟解决了一个SEGMENTATION FAULT 错误

一段LINUX小应用程序。主要功能是MMAP一段内存,MEMCPY点东西上去。

但是程序运行起来后,出现了SEGMENTATION FAULT的错误提示。如果是以前,我多半就慌了,也不知道咋解决。不过最近看了WING老兄的那篇文章之后,对这种提示已经没什么恐惧心理了,

呵呵。言规正传,我们知道SEGMENTATION FAULT一般也就是访问内存时出错了。由于我用到了MMAP, MEMCPY等。那么出错也很有可能。但是我想了下,上面那2个函数都没错啊,范围大小什么也都对。于是加了点PRINTF。发现是MEMCPY之后才出错的。比较奇怪,MEMCPY之后还有啥呢?

于是又开了个GDB调试下。在出现SGEMENTATION FAULT提示后,敲个“where”,看看在什么地方,显示是MAIN 531 行调用了PUTS,然后后面就是GLIBC的函数了。于是看看MAIN 的531, 是个PRINTF。 这也能引起SGEMENTATION FAULT? 有点怀疑。不过从调用PUTS来看,确实是PRINTF引起的。还真有点邪门啊。眼睛于是在PRINTF周围看了看。突然,发现上面一句是MUNMAP。这个也是和内存有关啊。有嫌疑。接着又仔细看了下。发现就是它。因为它在传入的大小参数时候是错的。主要原因是那个大小我之前改过几次,当时都是只改 MMAP那里,而忽略了MUNMAP!

于是改成正确的大小,搞定。前后大概也就5分钟吧。

No comments: