gdb常用指令

来源:互联网 发布:信封袋设计的软件 编辑:程序博客网 时间:2024/06/15 18:10
continue 继续运行程序直到下一个断点(类似于VS里的F5)
next 逐过程步进,不会进入子函数(类似VS里的F10)
setp 逐语句步进,会进入子函数(类似VS里的F11)
until 运行至当前语句块结束
finish 运行至函数结束并跳出,并打印函数的返回值(类似VS的Shift+F11)
调试已运行的程序
两种方法:
1、在UNIX下用ps查看正在运行的程序的PID(进程ID),然后用gdb <program> PID格式挂接正在运行的程序。
2、先用gdb <program>关联上源代码,并进行gdb,在gdb中用attach命令来挂接进程的PID。并用detach来取消挂接的进程。

在GDB中运行程序
————————
当以gdb <program>方式启动gdb后,gdb会在PATH路径和当前目录中搜索<program>的源文件。如要确认gdb是否读到源文件,可使用l或list命令,看看gdb是否能列出源代码。

在gdb中,运行程序使用r或是run命令。程序的运行,你有可能需要设置下面四方面的事。

1、程序运行参数。
  set args 可指定运行时参数。(如:set args 10 20 30 40 50)
  show args 命令可以查看设置好的运行参数。

2、运行环境。
  path <dir> 可设定程序的运行路径。
  show paths 查看程序的运行路径。
  set environment varname [=value] 设置环境变量。如:set env USER=hchen
  show environment [varname] 查看环境变量。

3、工作目录。
  cd <dir> 相当于shell的cd命令。
  pwd 显示当前的所在目录。

4、程序的输入输出。
  info terminal 显示你程序用到的终端的模式。
  使用重定向控制程序输出。如:run > outfile
  tty命令可以指写输入输出的终端设备。如:tty /dev/ttyb
一、设置断点(BreakPoint)
  我们用break命令来设置断点。正面有几点设置断点的方法:
  break <function>
  在进入指定函数时停住。C++中可以使用class::function或function(type,type)格式来指定函数名。
 
  break <linenum>
  在指定行号停住。
 
  break +offset
  break -offset
  在当前行号的前面或后面的offset行停住。offiset为自然数。

  break filename:linenum
  在源文件filename的linenum行处停住。

  break filename:function
  在源文件filename的function函数的入口处停住。

  break *address
  在程序运行的内存地址处停住。

  break
  break命令没有参数时,表示在下一条指令处停住。

  break ... if <condition>
  ...可以是上述的参数,condition表示条件,在条件成立时停住。比如在循环境体中,可以设置break if i=100,表示当i为100时停住程序。

  查看断点时,可使用info命令,如下所示:(注:n表示断点号)
  info breakpoints [n]
  info break [n]


二、设置观察点(WatchPoint)

  观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马上停住程序。我们有下面的几种方法来设置观察点:

  watch <expr>
  为表达式(变量)expr设置一个观察点。一量表达式值有变化时,马上停住程序。

  rwatch <expr>
  当表达式(变量)expr被读时,停住程序。

  awatch <expr>
  当表达式(变量)的值被读或被写时,停住程序。

  info watchpoints
  列出当前所设置了的所有观察点。


三、设置捕捉点(CatchPoint)

  你可设置捕捉点来补捉程序运行时的一些事件。如:载入共享库(动态链接库)或是C++的异常。设置捕捉点的格式为:

  catch <event>
  当event发生时,停住程序。event可以是下面的内容:
  1、throw 一个C++抛出的异常。(throw为关键字)
  2、catch 一个C++捕捉到的异常。(catch为关键字)
  3、exec 调用系统调用exec时。(exec为关键字,目前此功能只在HP-UX下有用)
  4、fork 调用系统调用fork时。(fork为关键字,目前此功能只在HP-UX下有用)
  5、vfork 调用系统调用vfork时。(vfork为关键字,目前此功能只在HP-UX下有用)
  6、load 或 load <libname> 载入共享库(动态链接库)时。(load为关键字,目前此功能只在HP-UX下有用)
  7、unload 或 unload <libname> 卸载共享库(动态链接库)时。(unload为关键字,目前此功能只在HP-UX下有用)
  tcatch <event>
四、修改变量值
  修改被调试程序运行时的变量值,在GDB中很容易实现,使用GDB的print命令即可完成。如:
  (gdb) print x=4
  x=4这个表达式是C/C++的语法,意为把变量x的值修改为4,如果你当前调试的语言是Pascal,那么你可以使用Pascal的语法:x:=4。

  在某些时候,很有可能你的变量和GDB中的参数冲突,如:
  (gdb) whatis width
  type = double
  (gdb) p width
  $4 = 13
  (gdb) set width=47
  Invalid syntax in expression.
  因为,set width是GDB的命令,所以,出现了“Invalid syntax in expression”的设置错误,此时,你可以使用set var命令来告诉GDB,width不是   你GDB的参数,而是程序的变量名,如:
  (gdb) set var width=47
  另外,还可能有些情况,GDB并不报告这种错误,所以保险起见,在你改变程序变量取值时,最好都使用set var格式的GDB命令。

五、GDB多线程调试的基本命令
info threads 显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID,后面操作线程的时候会用到这个ID。 前面有*的是当前调试的线程。

thread ID 切换当前调试的线程为指定ID的线程。

break thread_test.c:123 thread all 在所有线程中相应的行上设置断点

thread apply ID1 ID2 command 让一个或者多个线程执行GDB命令command。

thread apply all command 让所有被调试线程执行GDB命令command。

set scheduler-locking off|on|step 估计是实际使用过多线程调试的人都可以发现,在使用step或者continue命令调试当前被调试线程的时候,其他线程也是同时执行的,怎么只让被调试程序执行呢?通过这个命令就可以实现这个需求。off 不锁定任何线程,也就是所有线程都执行,这是默认值。 on 只有当前被调试程序会执行。 step 在单步的时候,除了next过一个函数的情况(熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行。 


原创粉丝点击