一段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分钟吧。
Friday, March 12, 2010
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment