• Linux gcc和gdb程序调试用法 {转}


    gcc一般调试格式:
    gcc -Wall -o  test   test.c // -wall  显示程序错误详细信息     
    gcc -v  // 显示gcc的版本
    gcc -o{1,2,3} test  test.c // 1,2,3三个级别的优化,优化级别越高编译的时间越长
    gcc -ggdb3 -Wall -o test  test.c // 运用gdb可以跟踪调试程序,运行这命令gdb告诉gcc,使用gdb扩展产生调试,其中3表示使用的第三级调试信息,程序员可以获得更多的信息。
    如果程序有多个模块构成可以分别编译,然后再整体生成一个可执行的文件
    gcc -c test1.c  //产生test1.o
    gcc -c test2.c  //生成test2.o
    gcc -c test3.c  //生成test3.o
    gcc -o program test1.o test2.o test3.o  //生成program 最终可执行文件
    关于gcc先这么多,以后用到,再补充。

    gdb 符号调试器
    gdb主要提供以下功能:
    1. 监视程序中变量的值得变化
    2. 设置断点,使程序在指定的代码行上暂停执行,便于观察
    3. 单步执行代码
    4. 分析崩溃程序产生core文件

    是首先 
    gcc -ggdb3 -Wall -o test  test.c  调试程序
    ./test  就是正常的执行程序
    如果出现了不正确的结果,再用gdb调试
    gdb test
    出现(gdb)接口提示符
    run  //开始运行程序,设置断点在开始运行之前,其他的命令都在运行程序下执行
    step | s //单步执行,遇见函数就进入函数
    next | n //单步执行,但不进入函数
    quit | q  //退出gdb 

    break LineNumber| functionName
    continue | cont N // 表示跳过的断点数
    tbreak  
    LineNumber| functionName // 这只一个临时的断电,执行一次就自动删除
    enable / disable  断点编号   // 回复失效的断点| 使有效的断点失效(如果操作多个断点,中间用空格分开)
    clear  断点的行号
    delete 断点的编号     clear/delete 都是清楚断点的,变量不一样啊
    watch  逻辑表达式  // 此命令在程序run中运用,必须把main函数设置为断点,然后continue,程序停止在满足逻辑表达式地方。

    查看栈的信息
    bt  number  //如果number>0  表示显示栈顶上number数栈的信息   
                       //若果number<0  表示显示栈底上number数栈的信息
                      //省略则显示栈的全部信息
    frame | f  n  // 显示第n层栈的信息   栈顶是0,一次类推
    up <n> // 栈向上移n层  省略默认一层
    down <n> // 栈向下移nceng 省略默认一层
    select-frame <n> == frame  //只是不输出栈的信息
    up-silently <n> == up  
    //只是不输出栈的信息 
    down-silently <n> == down //只是不输出栈的信息 
    info args  //显示当前函数参数名及值
    info locals //显示函数中所有局部变量
    info catch //显示当先函数的异常处理信息

    显示源代码
    list <function> //显示function函数的源程序
    list  // 显示当前行前后各显示listsize/2 行代码
    list - // 显示当前行 前面的代码
    list + // 显示当前行 后面的代码
    set listsize <number> // 设置一次显示源代码的行数
    show listsize  //查看listsize的数值
    list <first>,<last> //显示全部的源代码
    list  ,<last> // 显示从当前行到last的源代码
    list  <linenum> // 显示linenum行
    前后各显示listsize/2 行代码 
    list <+ ffset> // 显示当前行的正偏移量
    list <- ffset> //显示当前行的负偏移量

    搜索源代码
    forward-search <regexp> = search <regexp> // 向下搜索
    reverse-search <regexp> // 向上搜索
    directory <dirname:...> // 增加自定义文件搜索路径,多个路径用:隔开
    directory  // 清除所有自定义源文件搜索路径信息
    show directories //显示自定义源文件的搜索路径

    源代码的内存
    info line  查看源代码在内存中的地址。info line 后面可以跟“行号”、“函数名”、“文件名:行号”、“文件名:函数名”
    disassemble <>  // 后面的参数加的和上面的一样,显示汇编代码
     
    查看运行时的数据 

    print  variable  
    print file::variable | function::variable // 如果查看的是全局变量的,为了防止和局部变量重名,可以加上通过这个形式说明
    print *array@len  //显示动态数组
    print *array // 显示静态数组
    print  /<f> <expr> // 格式输出数据
    输出格式如下:
    x 十六进制显示
    d 十进制显示
    u 十六进制显示无符号整数
    o 八进制显示
    t  二进制显示
    a 十六进制显示
    c 字符格式显示
    f  浮点数格式显示
    查看内存
    x/<n/f/u> <addr> // 其中n表示显示的第三个参数的个数,f格式见上面,u从当前地址往后请求的字节数,默认为4,b代表单字节,h代表双字节,w代表4字节,g表示8字节

    自动显示
    display <expr> //只要变量有效的范围内都会显示
    undisplay | delete display <dnums...> // 删除编号为dnums的自动显示,同时删除好几个用空格隔开
    disable display <dnums...> // 使编号为dnums的自动显示失效,多个的也是空格隔开
    enable display <dnums...> //使编号为dnum的自动显示回复,多个也是用空格隔开
    info display // 显示全部自动显示的信息

    设置显示选项
    set print address on  //gdb一般会显示参数的地址信息 ,默认认为打开
    set print address off   //gdb一般不显示参数的地址信息
    show print address  //查看是否未打开
    set print array on // 打开数组的每个元素占一行
    set print array off // 关闭数组的每个元素以逗号隔开
    show print array //查看是否打开
    set print element <number-of-elements> // 显示数组最大的长度
    show print element
    set print null-stop <on/off> //  是否遇到结束符停止显示,默认是关闭的
    set print pretyy on // 结构体显示比较漂亮
    show print pretyy // 查看如何显示结构体
    set print sevenbit-strings  // 字符显示是否打开
    set print union <on/off> //是指显示结构体时候是否显示其内的联合体数据
    show print union
    set print object <on/off> //在c++,当一个对象指向派生类,打开这个选项,gdb会自动按虚方法调用的规则显示
    set print static-members <on/off> // C++对象中,是否显示其中静态数据成员,默认on
    show print static-members
    set print vtbl <on/off> // gdb会比较规整格式显示虚函数,默认关闭
    show pritn vtbl 

    查看寄存器
    info registers // 查看寄存器的情况(除了浮点寄存器)
    info all-registers //查看所有寄存器的情况(包括浮点寄存器)
    info registers <regname...>  //查看制定寄存器的情况

    gdb环境变量 
    //你可以环境调试中定义自己的变量,用来保存调试程序中的运行数据。
    set $var = expr
    show convenience  // 查看当前设置的所有环境变量
    ex > set $i=0
    print bar[$i++] -> contents  // 输入这样的命令后,只需按Enter,重复上一条语句,环境变量会自动累加

    修改变量值
    print  s = expr | set var s = expr  // 最好使用后者

    跳转执行 
    jump <linenumber> //跳转到linenumber行
    jump <address> // 跳转到地址为address处
    jump <+offse> // 向下跳offse行
    //使用jump命令最好在当前的函数的跳转,跨越函数跳转会发生错误

    signal <singal> // 信号量在1到15

    return 
    return <expr>
    //强制返回,返回可以带返回值

    call <func> // 强制调用函数

    不同的语言使用gdb 

    show language // 查看当前的语言环境
    info frame // 查看当前函数的程序语言
    info source // 查看当前文件的程序语言
    set language +语言名字 // 手动设置语言 // c/c++/asm/fortran/java/modula-2/pascal/scheme

    core dump 分析 

    ulimit -c unlimited // 是自己拥有使用core dump 的权限
    gdb test core+xxx // 系统防止本次生成core覆盖上次的,所有core后面加上pid号加以区分

  • 相关阅读:
    《试题库管理系统的设计与实现》11
    转 windows10安装docker
    转 linux 安装docker
    Centos7 离线安装RabbitMQ,并配置集群
    Linux配置Redis主从
    CENTOS7下安装REDIS
    sql删除相同数据(无主键)
    mybatis中 <if test=>等于的条件怎么写
    java 日期获取,每月一号,每周一
    Oracle中merge into的使用
  • 原文地址:https://www.cnblogs.com/chenzc/p/3758302.html
Copyright © 2020-2023  润新知