杰克·吉伦哈尔的博客 生活 学习

gdb常用命令

2017-10-31


DIR [directory]:程序包含多个文件时,导入文件夹

break/b [file:linenum]: 设置断点

b main.c:32

break [func]:在当前的文件中为某一函数(假设为func)处设定断点

break 46 if testsize==100:设置条件断点:如果testsize==100就在46行处断点

info break/b:显示所有断点

(gdb) info b Num Type Disp Enb Address What 1 breakpoint keep y 0x00000000004056a9 in ts_bspline_new at tinyspline.c:1386 2 breakpoint keep y 0x00000000004065cd in ts_read_ctrlp at tinyspline_io.c:321

delete breakpoint [num]: 删除指定的某个断点

(gdb) delete breakpoint 1 //如果不带编号参数,将删除所有的断点
(gdb) delete breakpoint

disable breakpoint 1:禁止使用某个断点,断点信息的 (Enb)域将变为 n enable breakpoint 1:允许使用某个断点,断点信息的 (Enb)域将变为 y

clear N:清除行N上面的所有断点

watch [expression]:在程序中设置一个监测点(即数据断点) watch i != 10:检测表达式变化则停住:这里,i != 10这个表达式一旦变化,则停住。watch 为表达式(变量)expr设置一个观察点。一量表达式值有变化时,马上停住程序(也是一种断点)

whatis:查看变量的类型

(gdb) whatis p type = int *

finish:立即执行完当前的函数,返回到调用它的函数

until/u:如果循环次数很多,执行完当前的循环

gdb -tui:启动gdb,并且分屏显示源代码,启动可以直接将屏幕分成两个部分,上面显示源代码,比用list方便多了。这时候使用上下方向键可以查看源代码,想要命令行使用上下键就用[Ctrl]n和[Ctrl]p

file [program]:用gdb而非gdb [program]时,载入指定的程序

(gdb) file ./nurbs

next/n:执行下一步:执行一行代码,如果是函数也会跳过函数。这个命令可以简化为n

next N:执行N次下一步

step:单步进入:执行一行代码,不过如果遇到函数的话就会进入函数的内部,再一行一行的执行

jump/j N:跳转执行程序到第N行:跳转到第N行执行完毕之后,如果后面没有断点则继续执行,而并不是停在那里了。另外,跳转不会改变当前的堆栈内容,所以跳到别的函数中就会有奇怪的现象,因此最好跳转在一个函数内部进行,跳转的参数也可以是程序代码行的地址,函数名等等类似list

return:强制返回当前函数:这样,将会忽略当前函数还没有执行完毕的语句,强制返回。return后面可以接一个表达式,表达式的返回值就是函数的返回值

backtrace:显示当前调用函数堆栈中的函数:命令产生一张列表,包含着从最近的过程开始的所有有效过程和调用这些过程的参数。当然,这里也会显示出当前运行到了哪里(文件,行)

kill:终止一个正在调试的程序。如果想不退出GDB而对当前正在调试的应用程序重新编译、链接,可以在GDB中执行kill杀掉子进程,等编译、链接完后,再重新执行run,GDB便可加载新的可执行程序启动调试

print /x var:用16进制显示(var)值 这里可以知道,print可以指定显示的格式,这里用’/x’表示16进制的格式。 可以支持的变量显示格式有:

  • x 按十六进制格式显示变量
  • d 按十进制格式显示变量
  • u 按十六进制格式显示无符号整型
  • o 按八进制格式显示变量
  • t 按二进制格式显示变量
  • a 按十六进制格式显示变量
  • c 按字符格式显示变量
  • f 按浮点数格式显示变量

print *a@10 :如果a是一个数组,10个元素,这样,会显示10个元素,无论a是double或者是int的都会正确地显示10个元素

print x=4: 修改运行时候的变量值,这里,x=4是C/C++的语

examine/x:查看内存地址中的值

ptype var:以更详细的方式显示变量var的类型,这里,会打印出var的结构定义

(gdb) ptype spline type = struct { size_t deg; size_t order; size_t dim; size_t n_ctrlp; size_t n_knots; tsReal *ctrlp; tsReal *knots; } *

list:列出相应于正在执行的程序的原文件内容

shell [command string]:在gdb环境中,你可以执行UNIX的shell的命令,使用gdb的shell命令来完成

make [make-args]:可以在gdb中执行make命令来重新build自己的程序。这个命令等价于shell make [make-args]

在gdb中,我们可以有以下几种暂停方式:断点(BreakPoint)、观察点(WatchPoint)、捕捉点(CatchPoint)、信号(Signals)、线程停止(Thread Stops)。如果要恢复程序运行,可以使用c或是continue命令

checkpoint


ulimit: 如果想让系统在信号中断造成的错误时产生core文件, 我们需要在shell中按如下设置(设置core大小为无限):

ulimit -c unlimited

注:每一次打开终端都需要设置一次

用gdb查看core文件: 发生core dump之后, 用gdb进行查看core文件的内容, 以定位文件中引发core dump的行.

gdb [exec file] [core file]

如:

gdb ~/git/Exstream/solver/bin/exstream_intel_debug core.8760

在进入gdb后, 就可以按照常规方法来调试

print arr: w为REAL(8)类型的Fortran数组,维数为(1:7,0:227,0:69,0:55)

(gdb) p w $1 = (PTR TO -> (REAL(8) (7,0:277,0:69,0:55))) 0x7f64a683a010

(gdb) p w(1,200,54,30) $2 = 0.03445566777855433

(gdb) p w(1:7,200,54,30) $3 = (0.03445566777855433, 1, 0, 0.33444556767654, 1, 0, 1)

注:gdb版本为7.2-50.e16,gcc版本为4.4.6

info/i

  • 查看当前程序栈的内容: x/10x $sp–>打印stack的前10个元素
  • 查看当前程序栈的信息: info frame—-list general info about the frame
  • 查看当前程序栈的参数: info args—lists arguments to the function
  • 查看当前程序栈的局部变量: info locals—list variables stored in the frame
  • 查看当前寄存器的值:info registers(不包括浮点寄存器) info all-registers(包括浮点寄存器)
  • 查看当前栈帧中的异常处理器:info catch(exception handlers)

valgrind:内存调试工具


参考链接: GDB调试一些命令 GDB调试 x p LINUX core dump详解 & GDB调试 How to print Fortran array in GDB? Gdb调试Fortran中的堆和栈 Linux 上的调试工具 (gdb )及valgrind valgrind之内存调试


上一篇 size_t格式

下一篇 论文写作

Comments

Content