zoukankan      html  css  js  c++  java
  • GDB Core,gdb 调试大全,core文件调试

    编译: 
    
    gcc -g -o hello hello.c   
    
    
    
    gdb 调试:
    基本 gdb 命令.
    命 令 描 述
    小结:常用的gdb命令     
      backtrace   显示程序中的当前位置和表示如何到达当前位置的栈跟踪(同义词:where)     
      breakpoint   在程序中设置一个断点     
      cd   改变当前工作目录     
      clear   删除刚才停止处的断点     
      commands   命中断点时,列出将要执行的命令     
      continue   从断点开始继续执行     
      delete   删除一个断点或监测点;也可与其他命令一起使用     
      display   程序停止时显示变量和表达时     
      down   下移栈帧,使得另一个函数成为当前函数     
      frame   选择下一条continue命令的帧     
      info   显示与该程序有关的各种信息     
      jump   在源程序中的另一点开始运行     
      kill   异常终止在gdb   控制下运行的程序     
      list   列出相应于正在执行的程序的原文件内容     
      next   执行下一个源程序行,从而执行其整体中的一个函数     
      print   显示变量或表达式的值     
      pwd   显示当前工作目录     
      pype   显示一个数据结构(如一个结构或C++类)的内容     
      quit   退出gdb     
      reverse-search   在源文件中反向搜索正规表达式     
      run   执行该程序     
      search   在源文件中搜索正规表达式     
      set   variable   给变量赋值     
      signal   将一个信号发送到正在运行的进程     
      step   执行下一个源程序行,必要时进入下一个函数     
      undisplay   display命令的反命令,不要显示表达式     
      until   结束当前循环     
      up   上移栈帧,使另一函数成为当前函数     
      watch   在程序中设置一个监测点(即数据断点)     
      whatis   显示变量或函数类型    
      gdb ./hello        #载入程序
      set args 1 2 3      #设置参数
      run
      基本gdb命令:
    
    
    
    
    
    
    
    Core文件: 
    
     1. 查看系统是否允许生成core文件   
    
    #ulimit -a   
      2. 使用如下命令取消限制,使系统能生成core文件 
    
    
    
    
    ulimit -c unlimited   
    或者指定core文件大小,如1K
    
    
    
    
    
    ulimit -c 1024   
    gdb调试core文件
    
    . 用gdb查看core文件:
    下面我们可以在发生运行时信号引起的错误时发生core dump了.
    发生core dump之后, 用gdb进行查看core文件的内容, 以定位文件中引发core dump的行.
    gdb [exec file] [core file]
    如:
    gdb ./test test.core
    在进入gdb后, 用bt命令查看backtrace以检查发生程序运行到哪里, 来定位core dump的文件->行.
    
    5. 用gdb实时观察某进程crash信息
    启动进程
    gdb -p PID
    c
    运行进程至crash
    gdb会显示crash信息
    bt
    
    简而言之,产生段错误就是访问了错误的内存段,一般是你没有权限,或者根本就不存在对应的物理内存,尤其常见的是访问0地址. 
    一般来说,段错误就是指访问的内存超出了系统所给这个程序的内存空间,通常这个值是由gdtr来保存的,他是一个48位的寄存器,其中的32位是保存由它 指向的 gdt表,后13位保存相应于gdt的下标,最后3位包括了程序是否在内存中以及程序的在cpu中的运行级别,指向的gdt是由以64位为一个单位的表, 在这张表中就保存着程序运行的代码段以及数据段的起始地址以及与此相应的段限和页面交换还有程序运行级别还有内存粒度等等的信息。一旦一个程序发生了越界 访问,cpu就会产生相应的异常保护,于是segmentation fault就出现了. 
    在编程中以下几类做法容易导致段错误,基本是是错误地使用指针引起的 
    1)访问系统数据区,尤其是往 系统保护的内存地址写数据 
    最常见就是给一个指针以0地址 
    2)内存越界(数组越界,变量类型不一致等) 访问到不属于你的内存区域 
  • 相关阅读:
    C#跨平台物联网通讯框架ServerSuperIO(SSIO)正式开源... 1
    神秘值分解(Singular Value Decomposition)
    mysql的sql执行计划详解(非常有用)
    springweb flux websocket
    springweb flux 服务器推送事件
    nodejs-express 报错View is not a constructor
    深入理解 Laravel Eloquent(三)——模型间关系(关联)
    Laravel 校验规则之字段值唯一性校验
    Notice: Trying to get property of non-object problem(PHP)解决办法 中间件只能跳转不能返任何数据
    慕客网laravel学习笔记
  • 原文地址:https://www.cnblogs.com/zendu/p/4991071.html
Copyright © 2011-2022 走看看