• gdb简易教程


    What is gdb

    GDB的全称是“GNU symbolic debugger”,从名称可以看出,它属于 GNU 计划(同时诞生的还有 GCC、Emacs 等),是 Linux 下常用的程序调试器。当下的 GDB 支持调试多种编程语言编写的程序,包括 C、C++、Go、Objective-C、OpenCL、Ada 等。实际场景中,GDB 更常用来调试 C 和 C++ 程序。

    gdb的安装

    #install gdb
    $ sudo apt-get install -y gdb
    
    #print gdb's version
    $ gdb -v

    gdb的简单调试

    以下面一段代码main.c为例子

    #include <stdio.h>
    int main ()
    {
        unsigned long long int n, sum;
        n = 1;
        sum = 0;
        while (n <= 100)
        {
            sum = sum + n;
            n = n + 1;
        }
        return 0;
    }

    启动gdb

    # 编译,-g参数打开gdb调试功能
    $ gcc main.c -o main.exe -g
    
    $ gdb main.exe
    GNU gdb (GDB) 8.0.1
    Copyright (C) 2017 Free Software Foundation, Inc.
    ......
    (gdb) 

    注意,该指令在启动 GDB 的同时,会打印出一堆免责条款。通过添加 --silent(或者 -q、--quiet)选项,可将比部分信息屏蔽掉:

    $ gdb main.exe --silent
    Reading symbols from main.exe...(no debugging symbols found)...done.
    (gdb) 

    gdb常用调试命令

    调试指令    作 用
    (gdb) break xxx
    (gdb) b xxx    在源代码指定的某一行设置断点,其中 xxx 用于指定具体打断点的位置。
    (gdb) run
    (gdb) r    执行被调试的程序,其会自动在第一个断点处暂停执行。
    (gdb) continue
    (gdb) c    当程序在某一断点处停止运行后,使用该指令可以继续执行,直至遇到下一个断点或者程序结束。
    (gdb) next
    (gdb) n    令程序一行代码一行代码的执行。
    (gdb) print xxx
    (gdb) p xxx    打印指定变量的值,其中 xxx 指的就是某一变量名。
    (gdb) list
    (gdb) l    显示源程序代码的内容,包括各行代码所在的行号。
    (gdb) quit
    (gdb) q    终止调试。

    如上所示,每一个指令既可以使用全拼,也可以使用其首字母表示。另外,表 1 中罗列的指令仅是冰山一角,GDB 还提供有大量的选项,可以通过 help 选项来查看。

    下面以 main.exe 可执行程序为例,接下来为演示部分选项的功能和用法

    (gdb) l                      <-- 显示带行号的源代码
    1 #include <stdio.h>
    2 int main ()
    3 {
    4     unsigned long long int n, sum;
    5     n = 1;
    6     sum = 0;
    7     while (n <= 100)
    8     {
    9         sum = sum + n;
    10         n = n + 1;
    (gdb)                      <-- 默认情况下,l 选项只显示 10 行源代码,如果查看后续代码,安装 Enter 回车即可                                                               
    11     }
    12     return 0;
    13 }
    (gdb) b 7               <-- 在第 7 行源代码处打断点
    Breakpoint 1 at 0x400504: file main.c, line 7.
    (gdb) r                   <-- 运行程序,遇到断点停止
    Starting program: /home/mozhiyan/demo1/main.exe
    
    Breakpoint 1, main () at main.c:7
    7     while (n <= 100)
    Missing separate debuginfos, use: debuginfo-install glibc-2.17-55.el7.x86_64
    (gdb) p n               <-- 查看代码中变量 n 的值
    $1 = 1                   <-- 当前 n 的值为 1,$1 表示该变量所在存储区的名称
    (gdb) b 12             <-- 在程序第 12 行处打断点
    Breakpoint 2 at 0x40051a: file main.c, line 12.
    (gdb) c                  <-- 继续执行程序
    Continuing.
    
    Breakpoint 2, main () at main.c:12
    12     return 0;
    (gdb) p n               <-- 查看当前 n 变量的值
    $2 = 101               <-- 当前 n 的值为 101
    (gdb) q                  <-- 退出调试
    A debugging session is active.
    
    Inferior 1 [process 3080] will be killed.
    
    Quit anyway? (y or n) y                 <-- 确实是否退出调试,y 为退出,n 为不退出
    [root@bogon demo]#
  • 相关阅读:
    IE、chrome、火狐中如何调试javascript脚本
    RFS_oracle的操作
    python_操作oracle数据库
    RFS_窗口或区域之间的切换
    RFS_关键字
    python_遇到问题
    python_GUI
    python_文件
    python之深浅拷贝
    python之编码和解码
  • 原文地址:https://www.cnblogs.com/ArsenalfanInECNU/p/14276184.html
Copyright © 2020-2023  润新知