什么是段错误?
段错误(segmentation fault)”是指你的程序尝试访问不允许访问的内存地址的情况。这可能是由于:
试图解引用空指针(你不被允许访问内存地址 0);
试图解引用其他一些不在你内存(LCTT 译注:指不在合法的内存地址区间内)中的指针;
一个已被破坏并且指向错误的地方的 C++ 虚表指针(C++ vtable pointer),这导致程序尝试执行没有执行权限的内存中的指令;
什么是valgrind以及如何使用?
valgrind是检查内存泄漏的利器,同时还是提供一些debug和优化的工具箱,为检查并解决内存泄漏问题提供了不小的便捷。
在Ubuntu中使用命令下载valgrind:
sudo apt-get install valgrind
使用valgrind检查段错误具体原因:
valgrind -v your-program
valgrind原理
请参考这篇文章:
valgrind 的使用 - 简书 (jianshu.com)
valgrind在调试时出现的一些错误提示及解析
1.
==3185== Use of uninitialised value of size 8
==3185== at 0x108602: main (a.c:6)
这种情况是很常见的, 原因是使用了未初始化的的地址, 这时候应该查看一下程序是否使用了未初始化的指针
2.
==3223== Invalid write of size 4
==3223== at 0x108602: main (a.c:6)8
==3223== Address 0x0 is not stack’d, malloc’d or (recently) free’d
这个错误原因是往错误的地址写入值, 这时候我们也应该查看一下程序用未初始化的指针赋值, 或者指针未被赋值.
和这个错误相对应的, 还有Invalid read of size 4错误提示.
3.
==3397== Conditional jump or move depends on uninitialised value(s)
==3397== at 0x108656: main (in /home/ciaiy/Desktop/codingSpace/c/free/a)
这个错误原因是变量未被初始化, 就被使用
4.
==3886== Invalid free() / delete / delete[] / realloc()
==3886== at 0x4C2CE1B: free (vg_replace_malloc.c:530)
==3886== by 0x1086CD: main (a.c:10)
这个错误原因是free掉了不属于自己的空间, 错误原因有可能是指针指向的内存不再属于它了
5.
==3839== HEAP SUMMARY:
==3839== in use at exit: 412 bytes in 1 blocks
==3839== total heap usage: 2 allocs, 1 frees, 924 bytes allocated
最后一个是堆内存分析, 如上面的提示所示, 程序在退出时, 仍有412字节的空间未被free
个人在编码时遇到的问题
我在搭建c++服务器框架时,编译通过,运行时提示"段错误(核心已转储)"的问题,具体如下:
归类于上述错误2:读取了无效的4字节内存空间。我定义了如下一个类
class LogEventWrap{
public:
LogEventWrap(LogEvent::ptr e);
~LogEventWrap();
stringstream& getSS();
private:
LogEvent::ptr m_event;
};
LogEventWrap::LogEventWrap(LogEvent::ptr e) {
}
上面代码块为LogEventWrap类的构造函数,可以看到,在构造函数中没有初始化类的私有变量m_event,而在运行代码时却需要访问这个变量,导致访问内存时出现问题,经过以下修改问题得以解决:
LogEventWrap::LogEventWrap(LogEvent::ptr e)
:m_event(e) {
}
————————————————————分割线————————————————————
后续又valgrind或Linux c++内存问题还会在此贴中更新