gdb调试段错误


  • 核心层

    gdb调试段错误

    首先打开core采集状态崩溃信息

    查看现在的资源限制,对core文件大小的设置

    ulimit -c
    0
    

    -c指的是允许生成的core的大小,单位字节;

    输出是0,那就是最多只能生成0字节==》即不允许生成core文件;

    修改对core文件大小的限制:

    [test1280@localhost 20170623]ulimitcunlimited[test1280@localhost20170623] ulimit -c unlimited
    [test1280@localhost 20170623] ulimit -c
    unlimited
    [test1280@localhost 20170623]$ ./main
    段错误 (core dumped)
    

    关键是:

    ulimit -c unlimited
    

    设置对core文件大小是无限的。

    当然,我们可以使用:

    ulimit -c 100
    

    注意这里的100单位是KB。

    还可以参考:https://blog.csdn.net/test1280/article/details/73655994

    里面还有一些bug的记录-

    然后设置gdb程序环境变量

    gdb开启调试

    调试段错误

    首先打开core文件

    然后运行程序,出现segment fault,并生成core文件

    gdb   a.out  core
    

    或者直接

    gdb a.out
    

    设置断点:

    cd到目录下设置断点
    再cd回来执行r
    

    设置断点

    代码放置在多个文件夹下,设置断点在某一个文件夹下其中一个源文件

    比如源文件有:

    file1.c file2.c

    main.c(包含file1.c file2.c )

    如果想在在file1.c中设置一个断点,且这个file还是在另一个目录下

    如果我们想在file1.c中的第40行设置断点,我们可以这样:

    (gdb)cd ../../../src/test
    (gdb)b test.cpp:40
    //注意这里一定要加上冒号:
    (gdb)cd ../../../../src/main
    (gdb)r
    

    设置条件断点

     b 17 if i == 8. 
    

    在17行设置一个断点,并且只有i==8的时候才会触发.

    打印信息

    打印当前函数参数值

    info args
    

    打印当前函数栈上值信息

    info  locals
    

    查看寄存器值

    info  registers
    

    打印内存地址中的数据

    x  /100dw   buffer
    

    x /23dw a 意思是 查看 从a地址开始 23个 4字节 有符号十进制数 输出.

    关于x 更加详细见下面

    用gdb查看内存格式: 
        x /nfu ptr
    
    说明
    x 是 examine 的缩写
    n表示要显示的内存单元的个数
    
    f表示显示方式, 可取如下值
    x 按十六进制格式显示变量。
    d 按十进制格式显示变量。
    u 按十进制格式显示无符号整型。
    o 按八进制格式显示变量。
    t 按二进制格式显示变量。
    a 按十六进制格式显示变量。
    i 指令地址格式
    c 按字符格式显示变量。
    f 按浮点数格式显示变量。
    
    u表示一个地址单元的长度
    b表示单字节,
    h表示双字节,
    w表示四字节,
    g表示八字节
    

    还可以使用gdb调试打印buffer连续内存地址中数据示例

    还可以参考:https://www.cnblogs.com/life2refuel/p/5396538.html



  • gdb确实在我们的项目中很有用了,码住


 

Copyright © 2018 bbs.dian.org.cn All rights reserved.

与 Dian 的连接断开,我们正在尝试重连,请耐心等待