1 出现core dump时最好的办法是使用gdb查看coredump文件
2 使用的条件
出现问题的代码,系统,所有涉及的代码都应该一起编译,然后得到符号表,这样加载符号表,使用coredump文件才有意义。
3 什么是段错误,有哪些原因会导致段错误
当访问了错误的地址时,就会发生段错误。之所以叫段错误,是因为只读数据段、代码段和操作系统所属的地址空间是不可以写的,因为拿到了指针可以做任何事情,不小心就写了。为了避免错误代码影响系统中的其它人,mmu和操作系统就会发出一个段错误给引起错误的进程,这个信号在unix link系统上叫SIGSEGV,进程都有该信号的一个handler,一旦收到该信号,handler就会立即结束本进程的执行,并且生成一个core dump文件。因为主要是访问了错误的段造成的,因此取名为段错误。
导致段错误的原因:
1> 解引用了一个null指针。
2> 试图访问一个不存在的地址,也就是说,超过了进程寻址空间的地址。
3> 试图访问没有访问权限的地址。
4> 试图去写一个只读的地址空间。
更直接一点的原因有:
1> 使用未初始化的指针。
2> 使用了已经释放了的指针。
3> 缓冲区溢出
4> 栈溢出
4 core dump文件本身
4.1 core dump文件是elf格式的
4.2 设置core dump文件的大小
ulimit -cn
4.3 core dump文件中没有符号表
4.4 core dump文件是进程的内存镜像
进程的内存镜像是真实的物理内存数据,物理内存数据分布在3G的用户地址空间中。
从上到下依次是,栈空间、内存映射空间(so)、堆空间,bss段、data段和代码段。
在进程收到SIGSEGV信号时,就会停止进程当前指令的执行,而将这些物理内存数据写入到一个文件中。这个文件就是core dump文件。
5 core dump文件的生成
同4.4
6 core dump文件的解析
core dump文件中有程序死时的调用栈,因此只要能够将栈里面的指令对应到代码的哪个函数的哪一行,这样就可以定位错误了。所以,必须要该运行程序的符号表。
否则就会对应不上。系统崩溃的概率很小,很可能是自己写的代码或者动态库崩溃了,因此我们需要我们的程序的符号表,还需要所使用的动态库的符号表,必须是编译时生成的同一个符号表。
需要可执行程序的符号表,需要动态库的符号表。
5 backtrace具体的实现原理?