zoukankan      html  css  js  c++  java
  • gdb调试基本技巧

    1  说明

    本文主要介绍一些简单的、常用的gdb调试技巧。

    环境:GNU gdb (GDB) Red Hat Enterprise Linux (7.2-60.el6_4.1)

    参考文档:《gdb调试技巧》  作者不详

    2  测试代码

     1 #include <stdio.h>
     2 
     3 int test_func2(void) 
     4 {
     5     int a = 1; 
     6     int b = 2; 
     7 
     8     return a + b;
     9 }
    10 
    11 void test_func1(int flag)
    12 {
    13     int a[] = {0x12, 0x23, 0x43, 0x78};
    14     int b = 12;
    15     int i = 0;
    16     
    17     if (flag == 0) {
    18         return;
    19     }
    20 
    21     for (i = 0; i < sizeof(a)/sizeof(int); i++) {
    22         a[i] += b;
    23     }
    24     
    25     for (i = 0; i < sizeof(a)/sizeof(int); i++) {
    26         printf("%d	", a[i]);
    27     }
    28     
    29     printf("
    ");
    30     
    31     test_func2();
    32 
    33 }
    34 
    35 
    36 
    37 int main(void)
    38 {
    39     test_func1(1);
    40 
    41     test_func2();
    42 
    43     return 0;
    44 }
    View Code

    下面调试过程中的代码就是以上代码。

    编译:gcc -g test_gdb.c  (注:必须加上-g参数,表示在文件中加入调试信息)

    3  调试步骤

    • 与断点相关

    加入一个断点

    (gdb) b test_func1

    (gdb) break test_func2

    注:两种方式是等价的,一般简写为b

    加入一个断点并设置进入条件

    (gdb) b test_func1 if flag == 1

    显示断点信息

    (gdb) info b

    (gdb) info breakpoints

    失能一个断点

    (gdb) disable b 2

    注:disable了的停止点,GDB不会删除,需要时,enable即可。

    使能一个断点

    (gdb) enable b 2

    删除一个断点

    (gdb) delete break 2 

    • 运行与查看

    运行程序

    run或r

    列出源代码

    list或l

    单步调试

    next或n

    单步跟踪,进入函数

    step或s

    在指定行停住

    (gdb) b 25

    继续运行

    continue或c

     

    • 查看运行时的数据

    查看某一变量值

    (gdb) print b

    (gdb) print a[0]

    查看静态数组

    (gdb) print /x a

    注:/x表示以十六进制显示

    查看动态数组

    (gdb) print /x *a@4

    注:@的左边是数组的首地址的值,也就是变量array所指向的内容,右边则是数据的长度

    查看内存

    (gdb) x/4xh a

    语法格式:x/<n/f/u> <addr>

    n、f、u是可选的参数。

    n是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。

    f 表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是s,如果地址是指令地址,那么格式可以是i。

    u 表示从当前地址往后请求的字节数,u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字节,g表示八字节。

    gdb数据显示格式:

    x

    按十六进制格式显示变量

    d

    按十进制格式显示变量

    u

    按十六进制格式显示无符号整型

    o

    按八进制格式显示变量

    t

    按二进制格式显示变量

    a

    按十六进制格式显示变量

    c

    按字符格式显示变量

    f

    按浮点数格式显示变量

     

    查看数组a的内存的四个地址以十六进制显示,每个地址请求4个字节(因为数组成员定义为int):

     

    • 退出

    直接使用quit命令就可退出调试。

  • 相关阅读:
    python 中: lambda
    python 学习 argparse
    深度学习 ——style reconstruction
    简单linux命令1
    intptr_t 指针
    MySQL数据库基本命令-1
    交换机和路由器的区别
    UML图的使用
    操作系统总结链接
    操作系统总结
  • 原文地址:https://www.cnblogs.com/mrlayfolk/p/12994420.html
Copyright © 2011-2022 走看看