zoukankan      html  css  js  c++  java
  • 一、C语言调试—— gdb 的使用

    1.1 gdb 调试工具常用命令

    • list:展开调试的源代码,缩写 l;
    • break:设置断点,缩写为 b;
    • info break:查看断点信息,缩写为 i b
    • delete:删除断点
    • print:打印变量的值,缩写为 p;
    • run:程序开始运行,缩写 r,在 r 后可以加入程序启动启动参数,程序运行到断点处暂停; 
    • step:单步调试,可以进入子函数,缩写为 s;
    • next:单步调试,不进入子函数,缩写为 n;
    • continue:程序继续运行,,到下一断点处暂停,缩写为 c;
    • set args:设置运行参数
    • show args:查看运行参数
    • gdb attatch pid:加载运行中的进程进行调式
    • dir dirname ... :指定源目录
    • x/28hx ---:以十六进程输出内存块数据
    • kill:停止调试
    • 段错误调试:
      • 通过 ulimit 命令查看一下系统是否配置支持了 dump core 的功能。通过 ulimit -c 或 ulimit -a,可以查看 core file 大小的配置的情况,如果为 0,则表示系统关闭了 dump core;可以通过 ulimit -c unlimited 来打开。若发生了段错误,但没有 core dump,是由于系统禁止  core 文件的生成。
      • gdb [exec file] [core file] | gdb -c corefile execfile
      • backtrace:查看堆栈信息,缩写为 bt,注意 run 到出错的地方后,运行此命令,可以查看到错误的地方
      • frame 堆栈错误编号:切换到编号处堆栈
      • 之后用 gdb 的通用调试命令查看参数等

     1.2 例子

      swap.c

     1 #include <stdio.h>
     2 
     3 void swap(int *a, int *b);
     4 void swap_error(int a, int b);
     5 
     6 int main(void)
     7 {
     8     int i = 3;
     9     int j = 5;
    10 
    11     printf("i: %d, j: %d
    ", i, j);
    12     swap(&i, &j);
    13     printf("i: %d, j: %d
    ", i, j);
    14 
    15     return 0;
    16 }
    17 
    18 void swap(int *a, int *b)
    19 {
    20     int c = *a;
    21     *a = *b;
    22     *b = c;
    23 }
    24 
    25 void swap_error(int a, int b)
    26 {
    27     int c = a;
    28     a = b;
    29     b = c;
    30 }

      编译出目标文件(.o 文件): gcc -c -g -Wall swap.c

      编译出可执行文件:gcc -g -o app swap.o

      运行:gdb app

      运行 list 命令可以列出源码:

      

      list 后可以加函数名,列出函数,如 list main、list swap

      设置断点, break main(或者使用 break swap.c:main(或行号)) 和列出断点信息 info break,也可以通过 b 行号 设置断点

      

      运行程序,run(r) 命令:

      

      运行到下一行,next(n)命令:

      

      打印 i 的值,print(p) i:

      

      打印 i 的地址,p &i:

      

      进入子函数,step(s)命令:

      

      打印 a:

      

      a 的值与 i 的地址一样,即 a = &i

      删除断点,delete 断点标号:

      

       

        

      

      

  • 相关阅读:
    Centos下安装Redis
    BZOJ 4870 [Shoi2017]组合数问题 ——动态规划 矩阵乘法
    BZOJ 4868 [Shoi2017]期末考试 ——三分 枚举
    BZOJ 4584 [Apio2016]赛艇 ——动态规划
    BZOJ 2806 [Ctsc2012]Cheat ——后缀自动机 单调队列优化DP
    BZOJ 2330 [SCOI2011]糖果 ——差分约束系统 SPFA
    Topcoder SRMCards ——贪心
    CTSC 1999 家园 【网络流24题】星际转移
    BZOJ 3489 A simple rmq problem ——KD-Tree
    BZOJ 2733 [HNOI2012]永无乡 ——线段树 并查集
  • 原文地址:https://www.cnblogs.com/kele-dad/p/10533475.html
Copyright © 2011-2022 走看看