码迷,mamicode.com
首页 > 数据库 > 详细

GDB常用命令使用说明(一)

时间:2016-01-22 14:17:06      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:

本文由霸气的菠萝原创,转载请注明出处:http://www.cnblogs.com/xsln/p/5150725.html

GDB(GNU Debugger)是在Unix以及类Unix系统下的调试工具。功能极其强大,几乎涵盖了你所需要的全部功能。 
GDB主要帮忙你完成下面四个方面的功能: 
1.启动你的程序,可以按照你的定制要求随心所欲的运行程序。 
2.可让被调试的程序在你所指定的调置的断点处停住。 
3.当程序被停住时,可以检查此时你的程序中所发生的事,以及内存状态等。 
4.动态的改变你程序的执行环境。

 

gdb使用总旨:help指令很强大!多用help!help里面总会有你需要的信息。如果你不知道如何使用help,请在gdb里面输入:help all

 

 一、gdb使用前置条件:编译时加入debug信息。

    gcc/g++是在编译时加入-g,其他语言请自行百度。值得注意的是,-g分4个等级:

  1. -g0等于不加-g。即不包含任何信息
  2. -g1只包含最小信息,一般来说只有你不需要debug,只需要backtrace信息,并且真的很在意程序大小,或者有其他保密/特殊需求时才会使用-g1。
  3. –g2为gdb默认等级,包含绝大多数你需要的信息。
  4. –g3包含一些额外信息,例如包含宏定义信息。当你需要调试宏定义时,请使用-g3

二、gdb最常见的几个用法:

     1. 调试程序。有几种方法可以在gdb下运行你的程序:

        1)    gdb ${你的程序} 进入gdb后,输入run(简写r) ${arg1} ${arg2} … ${argN}

        2)    gdb --args ${你的程序} ${arg1} ${arg2} … ${argN} 进入gdb后,运行run。

        3)    gdb进入gdb后,输入file ${你的程序}。然后使用set args  ${arg1} ${arg2} … ${argN} 设定好你的程序参数,再运行run。

     2. 调试正在运行的程序:

        gdb ${你的程序} ${程序pid}

     3. 查core:

        gdb ${你的程序} ${core文件}

三、gdb常用命令:

  1. backtrace:显示栈信息。简写为bt。
  2. frame x 切换到第x帧。其中x会在bt命令中显示,从0开始。0表示栈顶。简写为f。
  3. up/down x 往上/下几帧。当不输入x时,默认为往上/下1帧。
  4. print x打印x的信息,x可以是变量,也可以是对象或者数组。
  5. print */&x 打印x的内容/地址。
  6. call 调用函数。注意此命令需要一个正在运行的程序。
  7. set substitute-path from_path  to_path,替换源码文件路径。当编译机与运行程序的机器代码路径不同时,需要使用该指令替换代码路径,否则你无法在gdb中看到源码。
  8. break x.cpp:n 在x.cpp的第n行设置断点,然后gdb会给出断点编号m。命令可简写为b。后面会对break命令进行更详细的解释。
  9. command m 设置程序执行到断点m时要看的内容,例如:

        command n

          >printf "x is %d\n",x

          >c

          >end

        如果command后面没有参数n,则命令被赋给最后一个breakpoint,这其实是说break和command连在一起用,在脚本里用就非常方便了。gdb脚本会在后面详细介绍

  1. continue 继续运行程序。进入调试模式后,若你已经获取了你需要的信息或者需要程序继续运行时使用。可简写为c
  2. until 执行到当前循环完成。可简写为u
  3. step 单步调试,步入当前函数。可简写为s
  4. next 单步调试,步过当前函数。可简写为n
  5. finish 执行到当前函数返回
  6. set var x=10 改变当前变量x的值。也可以这样用:set {int}0x83040 = 10把内存地址0x83040的值强制转换为int并赋值为10
  7. info locals 打印当前栈帧的本地变量
  8. jump使当前执行的程序跳转到某一行,或者跳转到某个地址。由于只会使程序跳转而不会改变栈值,因此若跳出函数到另外的地方 会导致return出错。另外,熟悉汇编的人都知道,程序运行时,有一个寄存器用于保存当前代码所在的内存地址。所以,jump命令也就是改变了这个寄存器中的值。于是,你可以使用“set $pc”来更改跳转执行的地址。如: set $pc = 0x485
  9. return: 强制函数返回。可以指定返回值

 

GDB常用命令使用说明(一)

标签:

原文地址:http://www.cnblogs.com/xsln/p/5150725.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!