• GDB调试


    1、list命令

    在gdb中运行list命令(缩写l)可以列出代码,list的具体形式包括:

    list <linenum> ,显示程序第linenum行周围的源程序,如:
    
    (gdb) list 15
    
    10     
    11     int array1[10] =
    12     {
    13      48, 56, 77, 33, 33, 11, 226, 544, 78, 90
    14     };
    15     int array2[10] =
    16     {
    17      85, 99, 66, 0x199, 393, 11, 1, 2, 3, 4
    18     };
    19
    
    list <function> ,显示函数名为function的函数的源程序,如:
    (gdb) list main
    
    2    {
    3     return a + b;
    4    }
    5
    6    main()
    7    {
    8     int sum[10];
    9     int i;
    10     
    11     int array1[10] =
    list,显示当前行后面的源程序。
    list - ,显示当前行前面的源程序。
    

    2、run命令

    在gdb中,运行程序使用run命令。

    · 程序运行参数

    set args 可指定运行时参数,

    如:set args 10 20 30 40 50;show args 命令可以查看设置好的运行参数。

    · 运行环境

    path

    可设定程序的运行路径;how paths可查看程序的运行路径;set environment varname [=value]用于设置环境变量,如set env USER=baohua;

    · 工作目录

    cd

    相当于shell的cd命令;pwd 显示当前所在的目录。

    · 程序的输入输出

    info terminal 用于显示程序用到的终端的模式;gdb中也可以使用重定向控制程序输出,如run > outfile;

    tty命令可以指定输入输出的终端设备,如:tty /dev/ttyS1。

    3、break命令

    在gdb中用break命令来设置断点,

    break 在进入指定函数时停住,C++中可以使用class::function或function(type, type)格式来指定函数名。
    break 在指定行号停住。
    break +offset / break -offset 在当前行号的前面或后面的offset行停住,offiset为自然数。
    break filename:linenum 在源文件filename的linenum行处停住。
    break filename:function 在源文件filename的function函数的入口处停住。
    break *address 在程序运行的内存地址处停住
    break break命令没有参数时,表示在下一条指令处停住。

    4、单步命令

    在调试过程中,next命令用于单步执行,类似VC++中的step over。next的单步不会进入函数的内部,与next对应的step(缩写s)命令则在单步执行一个函数时,会进入其内部,类似VC++中的step into。下面演示了step命令的执行情况,在23行的add()函数调用处执行step会进入其内部的“return a+b;”语句:

    (gdb) break 25

    Breakpoint 1 at 0x8048362: file gdb_example.c, line 25.

    (gdb) run

    Starting program: /driver_study/gdb_example

    Breakpoint 1, main () at gdb_example.c:25

    25 sum[i] = add(array1[i], array2[i]);

    (gdb) step

    add (a=48, b=85) at gdb_example.c:3

    3 return a + b;

    step 单步跟踪,如果有函数调用,则进入该函数(进入函数的前提是,此函数被编译有debug信息)。step后面不加count表示一条条地执行,加表示执行后面的count条指令,然后再停住
    next 单步跟踪,如果有函数调用,它不会进入该函数。同样地,next后面不加count表示一条条地执行,加表示执行后面的count条指令,然后再停住
    set step-mode set step-mode on用于打开step-mode模式,这样,在进行单步跟踪时,程序不会因为没有debug信息而不停住,这个参数的设置可便于查看机器码。set step-mod off用于关闭step-mode模式
    finish 运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息
    until 一直在循环体内执行单步,退不出来是一件令人烦恼的事情,until命令可以运行程序直到退出循环体
    stepi(缩写si)和nexti(缩写ni) stepi和nexti用于单步跟踪一条机器指令,一条程序代码有可能由数条机器指令完成,stepi和nexti可以单步执行机器指令。 另外,运行“display/i $pc”命令后,单步跟踪会在打出程序代码的同时打出机器指令,即汇编代码

    5、continue命令

    当程序被停住后,可以使用continue命令(缩写c,fg命令同continue命令)恢复程序的运行直到程序结束,或到达下一个断点

    6、print命令

    在调试程序时,当程序被停住时,可以使用print命令(缩写为p),或是同义命令inspect来查看当前程序的运行数据。

  • 相关阅读:
    技术领导要不要写代码?
    资深程序员告诉你:如何用五年时间攒够100万?
    mfc基于对话框的应用程序,如何设置初始对话框大小,移动控件位置
    zend studio,操作记录
    xampp怎么操作数据库mysql
    mysql-font的理解
    delphi 中配置文件的使用(*.ini)和TIniFile 用法
    delphi 创建服务,安装与卸载服务
    sublime Text的一些用法(emmet插件、)
    apache (web服务器) ->php->mysql,xampp与wamp比较,WAMP与WNMP有什么区别
  • 原文地址:https://www.cnblogs.com/hyxk/p/15591125.html
Copyright © 2020-2023  润新知