zoukankan      html  css  js  c++  java
  • Ubuntu1804下安装gdb与使用

    Ubuntu1804下安装gdb与使用

    1. Ubuntu1804下安装gdb

    sudo apt-get install gdb
    

    查看安装版本:

    gdb --version
    
    GNU gdb (Ubuntu 9.2-0ubuntu1~20.04) 9.2
    Copyright (C) 2020 Free Software Foundation, Inc.
    

    2.Ubuntu1804下gdb使用

    1. GDB调试实例

    • 首先创建一个C语言文件test.c
      vim test.c
    #include <stdio.h>
    void ShowRevertNum(int iNum)
    {
        
         while (iNum > 10)
         {
        
            printf("%d", iNum % 10);
            iNum = iNum / 10;
         }
         printf("%d
    ", iNum);
    }
    int main(void)
    {
        
         int iNum;
         printf("Please input a number :");
         scanf("%d", &iNum);
         printf("After revert : ");
         ShowRevertNum(iNum);
    }
    
    

    上面的代码可以逆序输出一个整型数,比如输入123,则输出321。

    • 使用gcc生成可执行文件并编译运行
    gcc -o test1 test.c
    ./test1
    

    运行结果:

    可以看到,在输入100的时候输出结果是错误的

    • 下面开始用GDB进行调试, 进入gdb
    gcc -o test1 -g test.c
    gdb test1
    
    • 输入l查看代码, 运行结果:

    • 下断点

    • 发现问题

    经过一步一步查看值的变化,发现iNum变成10了之后就不会再进入循环了,所以循环条件应该是大于等于10,我们要对错误进行修改,需要先退出gdb再进行对代码的修改。

    • 修改程序,解决问题

      程序编译运行后,输入100,得到正确的结果

    2. 内存出错的GDB调试

    Linux中,程序崩溃时,一般会产生core文件,记录进程退出前的状态,调试段错误问题,借助于该文件,可快速定位问题。

    • 首先让Linux系统产生core文件
      新建一个C语言文件,输入以下代码:
    #include<stdio.h>
    int main(void)
    {
        
    int *p=0;
    *p=1;
    return 0;
    }
    

    然后输入命令:

     ulimit –c 100
    

    让系统产生core文件,运行程序,让程序崩溃,产生core文件,使用gdb配合core文件,定位问题

    3.gdb的常用命令

    命令 结果
    file 装入想要调试的可执行文件
    kill 终止正在调试的程序
    list 列出产生执行文件的源代码的一部分
    next 执行一行源代码但不进入函数内部
    step 执行一行源代码而且进入函数内部
    run 执行当前被调试的程序
    c 继续运行程序
    quit 终止gdb
    watch 使你能监视一个变量的值而不管它何时被改变
    backtrace 栈跟踪,查出代码被谁调用
    print 查看变量的值
    make 使你能不退出gdb就可以重新产生可执行文件
    shell 使你能不离开gdb就执行UNIX shell命令
    whatis 显示变量或函数类型
    break 在代码里设断点,这将使程序执行到这里时被挂起
    info break 显示当前断点清单,包括到达断点处的次数等
    info files 显示被调试文件的详细信息
    info func 显示所有的函数名称
    info local 显示当函数中的局部变量信息
    info prog 显示被调试程序的执行状态
    delete [n] 删除第n个断点
    disable[n] 关闭第n个断点
    enable[n] 开启第n个断点
    ptype 显示结构定义
    set variable 设置变量的值
    call name(args) 调用并执行名为name,参数为args的函数
    Finish 终止当前函数并输出返回值
    return value 停止当前函数并返回value给调用者

    参考:
    https://www.i4k.xyz/article/Linux7985/52399439
    https://wizardforcel.gitbooks.io/100-gdb-tips/content/set-pagination-off.html

  • 相关阅读:
    【JavaWeb】SpringBoot配置静态资源路径
    apache和nginx设置反向代理
    【other】idea格式化快捷键ctr+alt+L与qq锁定冲突
    【深入Java基础】各个Map类的比较与总结
    【EmguCv】瞳孔定位(二)
    【深入Java基础】LinkedHashMap的特点与原理
    彪神666(暴力即可)
    被打脸的潇洒哥(推递推式)
    送气球.jpg(模拟)
    赌神(逆向思维)
  • 原文地址:https://www.cnblogs.com/michaelcjl/p/14887123.html
Copyright © 2011-2022 走看看