zoukankan      html  css  js  c++  java
  • gdb调试器

    GDB调试器


    gdb调试器是一款GNU开发组织并发布的UNIX/Linux下的程序调试工具。


    下面以一个简单程序为例,介绍gdb使用流程:

    1. 编辑文件test.c

      #include "stdio.h"

      int sum(int m);
      int main()
      {
      int i,n = 0;
      sum(50);
      for(i = 1 ; i <= 50 ;i++)
      {
      n += i;
      }
      printf("The sum of 1-50 is %d ",n);
      }
      int sum(int m)
      {
      int i,n =0;
      for (i = 1; i <= m; i++)
      {
      n += i;
      printf("The sum of 1-m is %d ",n);
      }
      }

    2. 对test.c进行编译

       hh@hh-virtual-machine:~$ gcc -g test.c -o test
      

    注意:一定要加上 -g 选项,这样编译出的可执行代码中才包含调试信息,否则之后gdb无法载入该可执行文件。

    1. 启动调试

       hh@hh-virtual-machine:~$ gdb test
      

    注意:gdb进行调试的是可执行文件,而不是“.c”的源代码,因此,需要先通过gcc编译生成可执行文件才能用gdb进行调试。

    1. “l” 查看载入的文件

       (gdb) l
       1	#include <stdio.h>
       2	int sum(int m);
       3	int main()
       4	{
       5		int i,n = 0;
       6		sum(50);
       7		for(i = 1 ; i <= 50 ;i++)
       8		{
       9			n += i;
       10		}
       (gdb) l
       11		printf("The sum of 1-50 is %d 
      ",n);
       12	}
       13	int sum(int m)
       14	{
       15		int i,n =0;
       16		for (i = 1; i <= m; i++)
       17		{
       18			n += i;
       19			printf("The sum of 1-m is %d
      ",n);
       20		}
      
    2. “b”设置断点

       (gdb) b 6
       Breakpoint 1 at 0x804842e: file test.c, line 6.
      

    注意:gdb中利用行号设置断点是指代码运行到对应行之前停止,如上例,代码运行到第6行之前停止(并没有运行第6行)

    1. “info b”查看断点情况

       (gdb) info b
       Num     Type           Disp Enb Address    What
       1       breakpoint     keep y   0x0804842e in main at test.c:6
      
    2. 运行代码

       (gdb) r
       Starting program: /home/hh/test 
      
       Breakpoint 1, main () at test.c:6
       6		sum(50);
      

    可以看到,程序运行到断点处就停止了。

    1. 查看变量值“p”+变量名

       (gdb) p n
       $1 = 0
       (gdb) p i
       $2 = 134513851
      
    2. “n”(next)单步运行

       (gdb) n
       The sum of 1-m is 1275
       7		for(i = 1 ; i <= 50 ;i++)
      

      “s”(step)单步运行

       (gdb) s
       9			n += i;
      

      注意:它们之间的区别在于,若有函数调用的时候,“s”会进入该函数而“n”不会进入该函数。

    10 . "c"恢复程序运行

    	(gdb) c
    	Continuing.
    	The sum of 1-50 is 1275 
    	[Inferior 1 (process 6666) exited with code 031]
    

    GDB最基本的命令有

    gdb programm      启动GDB
    list(或l)	    列出源代码,接着上次的位置往下列,每次列10行
    list 行号	         列出从第几行开始的源代码
    list 函数名	    列出某个函数的源代码
    b(break) 		  设断点(要会设4种断点:行断点、函数断点、条件断点、临时断点)
    delete  		  删除指定断点
    run 			  开始运行程序
    bt 				  打印函数调用堆栈
    info  break			查看断点详细信息            
    p 				  查看变量值
    c 				  从当前断点继续运行到下一个断点
    backtrace(或bt)	查看当前栈的情况,即可以查看到哪些被调用的函数尚未返回
    next(或n)		单步恢复程序运行,但不进入函数调用
    step(或s)		执行下一行语句,如果有函数调用则进入到函数中
    quit 			  退出GDB]
    

    其他几个我认为应该掌握的调试命令有:

    display 跟踪变量值的改变
    until   跳出循环
    finish  跳出函数
    help    帮助
    

    gdb使用时的注意点

    • 在gcc编译选项中一定要加入“-g”
    • 只有在代码处于“运行”或“暂停”状态时才能查看变量值
    • 设置断点后程序在指定行之前停止
  • 相关阅读:
    Docker 部署项目
    Python+Pywinauto+Lackey 实现PC端.exe 自动化测试
    03_Fiddler 导出jmx文件
    02_Postman 中文汉化版
    07_Linux系统(Centos)安装tomcat和部署Web项目
    05_oracel题集
    02_appium基本使用
    01_appium的安装
    02_Monkey使用
    01_Monkey安装
  • 原文地址:https://www.cnblogs.com/myidea/p/4854834.html
Copyright © 2011-2022 走看看