• Linux调试器-gdb使用


    1. 背景

    ●  程序的发布方式有两种,debug模式和release模式

    ●  Linux gcc/g++出来的二进制程序,默认是release模式

    ●  要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项(生成debug信息)

    ●  介绍一下readelf -S,可以读取一个可执行程序的二进制构

    ●  下载命令:yum install -y gdb

    ●   查看gdb版本 : gdb --version

    2. 介绍调试命令

    gdb binFile 退出: ctrl + d quit 调试命令:

    ●  gdb 文件:进入调试环境·

    ●  list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。
    ●  list/l 函数名:列出某个函数的源代码。

    ●  r或run:运行程序。

    ●  n 或 next:单条执行。

    ●  s或step:进入函数调用,可以在函数进行逐语句的调试

    ●  break(b) 行号:在某一行设置断点

    ●  info break :查看断点信息。 

    ●  print(p):打印表达式的值,通过表达式可以修改变量的值或者调用函数

    ●  p 变量:打印变量值。p &i:查看变量的地址

    ●  set var:修改变量的值

    ●  continue(或c):从当前位置开始连续而非单步执行程序
    ●  run(或r):从开始连续而非单步执行程序

    ●  delete breakpoints:删除所有断点

    ●  d n(delete breakpoints n):删除序号为n的断点

    ●  disable breakpoints:禁用断点

    ●  enable breakpoints:启用断点

    ●  info(或i) breakpoints:参看当前设置了哪些断点

    ●  display 变量名:跟踪查看一个变量,每次停下来都显示它的值

    ●  undisplay:取消对先前设置的那些变量的跟踪

    ●  until X行号:跳至X行

    ●  finish:执行到当前函数返回,然后挺下来等待命令

    ●  breaktrace(或bt):查看各级函数调用及参数

    ●  info(i) locals:查看当前栈帧局部变量的值

    ●  c :下一个断点

    ●  quit:退出gdb,历史命令会消失

    3. 理解

    ●  和windows IDE对应例子

    4.开始使用

    使用环境

    //makefile

    mycode:mycode.c
    gcc -o $@ $^ -g
    .PHONY:clean
    clean:
    rm -f mycode
    

    //mycode.c

     
     

    #include

    void Print3()

    {

            printf("hello printf1\n");

    }

    void Print2()

    {

            printf("hello printf1\n");

            Print3();

    }

    void Print1()

    {

            printf("hello printf1\n");

            Print2();

    }

    int addToTop(int top)

    {

            int res = 0;

            int i = 1;

            for(; i <= top; i++)

            {

                    res += i;

            }

            Print1();

            return res;

    }

    int main()

    {

            printf("debug begin\n");

            int top = 100;

            int sum = addToTop(top);

            printf("sum: %d\n", sum);

            printf("debug end\n");

            return 0;

    }

    readelf -S

    查看二进制文件代码

    list 行号的使用

    一般情况下以行号为中间行输出,特殊情况下如行号靠近开头或结尾。

    list (l)  0 后回车

    可以打印所有代码

    设置断点和打印断点信息

    删除段点 d + 断点编号/ d 删除所有断点

    (退出调试,断点信息全部消失)

    设置断点后,r+回车,运行时会在断点处停止

    n(next):逐过程,把函数直接当成语句,直接运行函数

    s(step):逐语句,会进入函数,不跳过代码块

    显示变量

    长显示变量和取消长显示

    限定代码出错的上下文

    until 行号:

    快速运行到指定行

    finish

    不小心进入函数时,结束函数,返回结果,可以用于测试函数。

    c(continue)

    直接运行到下一个断点

    disable n 和 enable n

    关闭断点和开启断点

    set var设置变量

    bt:查看各级函数调用及参数

    info locals:查看当前栈帧局部变量的值

  • 相关阅读:
    x64内核实验2-段机制的变化
    Oracle中分割字符串的方法
    《现代命令行工具指南》10. 管理工具:在隔离环境中安装和运行 Python 命令行工具 - Pipx
    第14章总结:lambda表达式与处理
    java后端社招面试经历
    docker swarm 使用详解
    $.ajax() 方法案例
    iOS 17 Simulator Failed with HTTP status 400:bad request
    CSS3 盒模型- 外边距折叠
    使用 lkdtm 内核模块进行内核崩溃测试
  • 原文地址:https://blog.csdn.net/weixin_72040293/article/details/133633455