zoukankan      html  css  js  c++  java
  • gdb coredump的使用

    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具体的实现原理?

  • 相关阅读:
    2021年51套数学分析高等代数试题/27套解答目录
    锦哥东北师范大学2021年数学分析考研试题参考解答
    锦哥东北师范大学2021年高等代数与解析几何考研试题参考解答
    2021年42套考研试题
    东北大学2021年高等代数考研试题参考解答
    东北大学2021年数学分析考研试题参考解答
    25套2021年数学分析高等代数考研试题参考解答
    锦哥大连理工大学2021年高等代数考研试题
    锦哥大连理工大学2021年数学分析考研试题
    锦哥中国科学技术大学2021年数学分析考研试题
  • 原文地址:https://www.cnblogs.com/hustdc/p/6868546.html
Copyright © 2011-2022 走看看