Ubuntu c++:段错误(核心已转储)

什么是段错误?

段错误(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++服务器框架时,编译通过,运行时提示"段错误(核心已转储)"的问题,具体如下:

Ubuntu c++:段错误(核心已转储)_第1张图片

归类于上述错误2:读取了无效的4字节内存空间。我定义了如下一个类

上面代码块为LogEventWrap类的构造函数,可以看到,在构造函数中没有初始化类的私有变量m_event,而在运行代码时却需要访问这个变量,导致访问内存时出现问题,经过以下修改问题得以解决:

————————————————————分割线————————————————————

后续又valgrind或Linux c++内存问题还会在此贴中更新

你可能感兴趣的:(Linux,c++,c++,ubuntu,后端)