GDB 调试 一些命令

1.html

gdb查看指定地址的内存地址的值:examine 简写 x-----使用gdb> help x 来查看使用方式
     x/ (n,f,u为可选参数)
n: 须要显示的内存单元个数,也就是从当前地址向后显示几个内存单元的内容,一个内存单元的大小由后面的u定义
f:显示格式
               x(hex) 按十六进制格式显示变量。
               d(decimal) 按十进制格式显示变量。
               u(unsigned decimal) 按十进制格式显示无符号整型。
               o(octal) 按八进制格式显示变量。
               t(binary) 按二进制格式显示变量。
               a(address) 按十六进制格式显示变量。
               c(char) 按字符格式显示变量。
               f(float) 按浮点数格式显示变量
例如:
你可使用examine命令(简写是x)来查看内存地址中的值。x命令的语法以下所示:

x/<n/f/u> <addr>

n、f、u是可选的参数。

n是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。
f 表示显示的格式,参见上面。若是地址所指的是字符串,那么格式能够是s,若是 地址是指令地址,那么格式能够是i。
u 表示从当前地址日后请求的字节数,若是不指定的话,GDB默认是4个bytes。u参数能够用下面的字符来代替,b表示单字节,h表示双字节,w表示四字 节,g表示八字节。当咱们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其看成一个值取出来。

<addr>表示一个内存地址。
n/f/u三个参数能够一块儿使用。例如:

命令:x/3uh 0x54320 表示,从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示三个单位,u表示按十六进制显示。

输出格式
通常来讲,GDB会根据变量的类型输出变量的值。但你也能够自定义GDB的输出的格式。例如,你想输出一个整数的十六进制,或是二进制来查看这个整型变量的中的位的状况。要作到这样,你可使用GDB的数据显示格式:

x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。
(gdb) p i
$21 = 101 

(gdb)p/a i
$22 = 0x65

(gdb)p/c i
$23 = 101 'e'

(gdb)p/f i
$24 = 1.41531145e-43

(gdb)p/x i
$25 = 0x65

(gdb)p/t i
$26 = 1100101
====================================


【yasi】



1)用x命令查看内存

x/3uh 0x54320从地址0x54320开始,读取3个双字节(h),以十六进制方式显示(u)

3能够替换成任意正整数

u能够替换成:

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

h能够替换成:

b表示单字节,h表示双字节,w表示四字 节,g表示八字节



2)p命令中加参数以不一样形式打印变量的值

(gdb)p/a i    或    (gdb)p/x i
$22 = 0x65

(gdb)p/c i
$23 = 101 'e'

(gdb)p/f i
$24 = 1.41531145e-43

(gdb)p/t i
$26 = 1100101

 


u:每一个单元的大小,按字节数来计算。默认是4 bytes。GDB会从指定内存地址开始读取指定字节,并把其看成一个值取出来,并使用格式f来显示
               b:1 byte     h:2 bytes     w:4 bytes g:8 bytes
     好比x/3uh 0x54320表示从内存地址0x54320读取内容,h表示以双字节为单位,3表示输出3个单位,u表示按照十六进制显示。
    from http://www.cnblogs.com/super119/archive/2011/03/26/1996125.html
gdb打印表达式的值:print/f 表达式
f是输出的格式,x/d/u/o/t/a/c/f
表达式能够是当前程序的const常量,变量,函数等内容,可是GDB不能使用程序中所定义的宏
查看当前程序栈的内容: 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)

PS:多个源文件时指定breakpoint的位置
当有多个源文件的时候须要制定源文件设置断点:
break filename:linenum
break filename:func

例如:

  bool_t CManifestFile::parseManifestFile(const std::string& mnfName)express

  

若是有多层目录,则多线程

在gdb中,用dir命令把你所想加入的文件的目录指定出来,而后b 命令就能够用了。app

就是相似这样的:函数

dir ../app(相对路径,绝对路径都行)ui

b app2:XXXspa

XXX:为你所设置断点的行数.net



2.转自http://blog.chinaunix.net/uid-20760757-id-1872358.html

本文是手把手教你玩转GDB的第三篇,主要内容是介绍一些在程序调试过程当中最经常使用的GDB命令,废话很少话,开始今天的正题。
1.attach process-id/detach命令行

  • (1)attach process-id: 在GDB状态下,开始调试一个正在运行的进程,其进程ID为process-id
  • (2)detach: 中止调试当前正在调试有进程,与attach配对试用

    2.kill线程

  • (1)基本功能:杀掉当前GDB正在调试的应用程序所对应的子进程
  • (2)若是想不退出GDB而对当前正在调试的应用程序从新编译、连接,能够在GDB中执行kill杀掉子进程,等编译、连接完后,再从新执行run,GDB即可加载新的可执行程序启动调试

    3.多线程程序调试相关:

  • (1)thread threadno:切换当前线程到由threadno指定的线程
  • (2)info threads:查看GDB当前调试的程序的各个线程的相关信息
  • (3)thread apply [threadno] [all] args:对指定(或全部)的线程执行由args指定的命令

    4.多进程程序调试相关(fork/vfork):

  • (1)缺省方式:fork/vfork以后,GDB仍然调试父进程,与子进程不相关
  • (2)set follow-fork-mode mode:设置GDB行为,mode为parent时,与缺省状况同样;mode为child时,fork/vfork以后,GDB进入子进程调试,与父进程再也不相关
  • (3)show follow-fork-mode:查看当前GDB多进程跟踪模式的设置

    5.step & stepi

  • (1)step [count]: 若是没有指定count, 则继续执行程序,直到到达与当前源文件不一样的源文件中时中止;若是指定了count, 则重复行上面的过程count次
  • (2)stepi [count]: 若是没有指定count, 继续执行下一条机器指令,而后中止;若是指定了count,则重复上面的过程count次
  • (3)step比较常见的应用场景:在函数func被调用的某行代码处设置断点,等程序在断点处停下来后,能够用step命令进入该函数的实现中,但前提是该函数编译的时候把调试信息也编译进去了,负责step会跳过该函数。

    6.next & nexti

  • (1)next [count]: 若是没有指定count, 单步执行下一行程序;若是指定了count,单步执行接下来的count行程序
  • (2)nexti [count]: 若是没有指定count, 单步执行下一条指令;若是指定了count, 音频执行接下来的count条执行
  • (3)stepinexti的区别:nexti在执行某机器指令时,若是该指令是函数调用,那么程序执行直到该函数调用结束时才中止。

    7.continue [ignore-count] 唤醒程序,继续运行,至到遇到下一个断点,或者程序结束。若是指定ignore-count,那么程序在接下来的运行中,忽略ignore-count次断点。
    8. finish & return

  • (1)finish: 继续执行程序,直到当前被调用的函数结束,若是该函数有返回值,把返回值也打印到控制台
  • (2)return [expression]: 停止当前函数的调用,若是指定了expression,把expresson值当作当前函数的返回值;若是没有,直接结束当前函数调用

    9.信号的处理

  • (1)info signals info handle:打印全部的信号相关的信息,以及GDB缺省的处理方式:

 

(2)handle signal action: 设置GDB对具体某个信号的处理方式。signal能够为信号整数值,也能够为SIGSEGV这样的符号。action的取值有:

 

a. stopnostopnostop表示当GDB收到指定的信号,不会应用中止程序的执行,只会打印出一条收到信号的消息,所以,nostop也暗含了下面的print; 而stop则表示,当GDB收到指定的信号,中止应用程序的执行。
b. printnoprintprint表示若是收到指定的信号,打印出一条信息; noprintprint表示相反的意思
c. passnopasspass表示若是收到指定的信号,把该信号通知给应用程序; nopass表示与pass相反的意思
d. ignorenoignoreignorenopass同义,同理,noignorepass同义

 1.  cmake支持gdb的实现,首先在CMakeLists.txt下加入SET(CMAKE_BUILD_TYPE "Debug") 在下面加入:SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")缘由是CMake 中有一个变量 CMAKE_BUILD_TYPE ,能够的取值是 Debug Release RelWithDebInfo >和 MinSizeRel。当这个变量值为 Debug 的时候,CMake 会使用变量 CMAKE_CXX_FLAGS_DEBUG 和 CMAKE_C_FLAGS_DEBUG 中的字符串做为编译选项生成 Makefile;2.  在GDB中间加入程序启动参数好比咱们须要调试一个可执行文件./a.out help这时$gdb ./a.out进入到gdb的命令行模式下,而后:(gdb) set args help就能加上可执行文件须要的参数,若是要看argc[1]到argc[N]的参数,只须要(gdb) show args3. gdb中查看字符串,地址的操做,数据类型比始有一个int型的变量i,相要知道他的相关信息,能够(gdb) print i打印出变量i的当前值(gdb)x &i与上面的命令等价。若是有x命令看时,须要看一片内存区域,(若是某个地方的值为0,用x时会自动截断了)(gdb) x/16bx address单字节16进制打印address地址处的长度为16的空间的内存,16表示空间长度,不是16进制,x表示16进制,b表示byte单字节gdb看变量是哪一个数据类型 (gdb) whatis i便可知道i是什么类型的变量
相关文章
相关标签/搜索