当前位置:Gxlcms > 数据库问题 > gdb调试命令的使用及总结

gdb调试命令的使用及总结

时间:2021-07-01 10:21:17 帮助过:25人阅读

jump  指定下一条语句的运行点。可以是文件的行号,可以是file:line格式,可以是+num这种偏移量格式。表式着下一条运行语句从哪里开始。相当于改变了PC寄存器内容,堆栈内容并没有改变,跨函数跳转容易发生错误。

 

7.信号命令

signal   signal SIGXXX   产生XXX信号,如SIGINT。一种速查Linux查询信号的方法:# kill -l

handle   在GDB中定义一个信号处理。信号可以以SIG开头或不以SIG开头,可以用定义一个要处理信号的范围(如:SIGIO-SIGKILL,表示处理从SIGIO信号到SIGKILL的信号,其中包括SIGIO,SIGIOT,SIGKILL三个信号),也可以使用关键字all来标明要处理所有的信号。一旦被调试的程序接收到信号,运行程序马上会被GDB停住,以供调试。其可以是以下几种关键字的一个或多个:
  nostop/stop
    当被调试的程序收到信号时,GDB不会停住程序的运行,但会打出消息告诉你收到这种信号/GDB会停住你的程序  
  print/noprint
    当被调试的程序收到信号时,GDB会显示出一条信息/GDB不会告诉你收到信号的信息 
  pass 
  noignore 
    当被调试的程序收到信号时,GDB不处理信号。这表示,GDB会把这个信号交给被调试程序会处理。 
  nopass 
  ignore 
    当被调试的程序收到信号时,GDB不会让被调试程序来处理这个信号。 
  info signals 
  info handle 
    可以查看哪些信号被GDB处理,并且可以看到缺省的处理方式

  single命令和shell的kill命令不同,系统的kill命令发信号给被调试程序时,是由GDB截获的,而single命令所发出一信号则是直接发给被调试程序的。

 

8.运行Shell命令

  如(gdb)shell ls来运行ls。  

 

9.更多程序运行选项和调试

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

  set environment varname [=value] 设置环境变量。如:set env USER=hchen 

  show environment [varname] 查看环境变量。 

3、工作目录。

  cd    相当于shell的cd命令。 

  pwd  显示当前的所在目录。 
4、程序的输入输出。 
  info terminal 显示你程序用到的终端的模式。 
  使用重定向控制程序输出。如:run > outfile 
  tty命令可以指写输入输出的终端设备。如:tty /dev/ttyb

5、调试已运行的程序

两种方法: 
  (1)在UNIX下用ps查看正在运行的程序的PID(进程ID),然后用gdb PID格式挂接正在运行的程序。 
  (2)先用gdb 关联上源代码,并进行gdb,在gdb中用attach命令来挂接进程的PID。并用detach来取消挂接的进程。

6、暂停 / 恢复程序运行  当进程被gdb停住时,你可以使用info program 来查看程序的是否在运行,进程号,被暂停的原因。 在gdb中,我们可以有以下几种暂停方式:断点(BreakPoint)、观察点(WatchPoint)、捕捉点(CatchPoint)、信号(Signals)、线程停止(Thread Stops),如果要恢复程序运行,可以使用c或是continue命令。

7、线程(Thread Stops)

如果程序是多线程,可以定义断点是否在所有的线程上,或是在某个特定的线程。 
  break thread
  break thread if ... 
  linespec指定了断点设置在的源程序的行号。threadno指定了线程的ID,注意,这个ID是GDB分配的,可以通过“info threads”命令来查看正在运行程序中的线程信息。如果不指定thread 则表示断点设在所有线程上面。还可以为某线程指定断点条件。如: 
  (gdb) break frik.c:13 thread 28 if bartab > lim 
当你的程序被GDB停住时,所有的运行线程都会被停住。这方便查看运行程序的总体情况。而在你恢复程序运行时,所有的线程也会被恢复运行。

 

10.调试core文件

Core Dump:Core的意思是内存,Dump的意思是扔出来,堆出来。开发和使用Unix程序时,有时程序莫名其妙的down了,却没有任何的提示(有时候会提示core dumped),这时候可以查看一下有没有形如core.进程号的文件生成,这个文件便是操作系统把程序down掉时的内存内容扔出来生成的, 它可以做为调试程序的参考

(1)生成Core文件

  一般默认情况下,core file的大小被设置为了0,这样系统就不dump出core file了。修改后才能生成core文件。

  #设置core大小为无限
  ulimit -c unlimited
  #设置文件大小为无限
  ulimit unlimited

  这些需要有root权限, 在ubuntu下每次重新打开中断都需要重新输入上面的第一条命令, 来设置core大小为无限

core文件生成路径:输入可执行文件运行命令的同一路径下。若系统生成的core文件不带其他任何扩展名称,则全部命名为core。新的core文件生成将覆盖原来的core文件。

1)/proc/sys/kernel/core_uses_pid可以控制core文件的文件名中是否添加pid作为扩展。文件内容为1,表示添加pid作为扩展名,生成的core文件格式为core.xxxx;为0则表示生成的core文件同一命名为core。
可通过以下命令修改此文件:
echo "1" > /proc/sys/kernel/core_uses_pid

2)proc/sys/kernel/core_pattern可以控制core文件保存位置和文件名格式。
可通过以下命令修改此文件:
echo "/corefile/core-%e-%p-%t" > core_pattern,可以将core文件统一生成到/corefile目录下,产生的文件名为core-命令名-pid-时间戳
以下是参数列表:
    %p - insert pid into filename 添加pid
    %u - insert current uid into filename 添加当前uid
    %g - insert current gid into filename 添加当前gid
    %s - insert signal that caused the coredump into the filename 添加导致产生core的信号
    %t - insert UNIX time that the coredump occurred into filename 添加core文件生成时的unix时间
    %h - insert hostname where the coredump happened into filename 添加主机名
    %e - insert coredumping executable name into filename 添加命令名

(2)用gdb查看core文件

  发生core dump之后, 用gdb进行查看core文件的内容, 以定位文件中引发core dump的行.
  gdb [exec file] [core file]
  如:
  gdb ./test core

  或gdb ./a.out
   core-file core.xxxx
  gdb后, 用bt命令backtrace或where查看程序运行到哪里, 来定位core dump的文件->行.

  待调试的可执行文件,在编译的时候需要加-g,core文件才能正常显示出错信息

  1)gdb -core=core.xxxx
  file ./a.out
  bt
  2)gdb -c core.xxxx
  file ./a.out
  bt

(3)用gdb实时观察某进程crash信息

  启动进程
  gdb -p PID
  c
  运行进程至crash
  gdb会显示crash信息
  bt

gdb调试命令的使用及总结

标签:无限   自动删除   ret   ops   tin   break   方法   delete   kill   

人气教程排行