GDB常用命令

来源:互联网 发布:关羽看不起黄忠 知乎 编辑:程序博客网 时间:2024/06/06 00:17
GDB常用命令
运行


run(简写r): 运行程序,当遇到断点后,程序会在断点处停止运行,等待用户输入下一步的命令。 
continue(简写c):继续执行,到下一个断点处(或运行结束) 
next(简写n): 单步跟踪程序,当遇到函数调用时,直接调用,不进入此函数体; 
step(简写s):单步调试如果有函数调用,则进入函数;与命令n不同,n是不进入调用的函数的 


until:运行程序直到退出循环体; / until+行号: 运行至某行 
finish: 运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息。 
call 函数(参数):调用“函数”,并传递“参数”,如:call gdb_test(55) 
quit:简记为 q ,退出gdb


设置断点


break n(简写b n):在第n行处设置断点 ;可以带上代码路径和代码名称: b OAGUPDATE.cpp:578) 
break func:在函数func()的入口处设置断点,如:break cb_button 
delete 断点号n:删除第n个断点 
disable 断点号n:暂停第n个断点 
enable 断点号n:开启第n个断点 
clear 行号n:清除第n行的断点 
info breakpoints(简写info b) :显示当前程序的断点设置情况


查看源代码


list(简写l):列出程序的源代码,默认每次显示10行。 
list 行号:将显示当前文件以“行号”为中心的前后10行代码,如:list 12 
list 函数名:将显示“函数名”所在函数的源代码,如:list main 
list :不带参数,将接着上一次 list 命令的,输出下边的内容。


打印表达式


print 表达式:简记为 p ,其中“表达式”可以是任何当前正在被测试程序的有效表达式,比如当前正在调试C语言的程序,那么“表达式”可以是任何C语言的有效表达式,包括数字,变量甚至是函数调用。 
print a:将显示整数 a 的值 
print ++a:将把 a 中的值加1,并显示出来 
print name:将显示字符串 name 的值 
print gdb_test(22):将以整数22作为参数调用 gdb_test() 函数 
print gdb_test(a):将以变量 a 作为参数调用 gdb_test() 函数


display 表达式:在单步运行时将非常有用,使用display命令设置一个表达式后,它将在每次单步进行指令后,紧接着输出被设置的表达式及值。如: display a 
watch 表达式:设置一个监视点,一旦被监视的“表达式”的值改变,gdb将强行终止正在被调试的程序。如: watch a


查询运行信息


where/bt :当前运行的堆栈列表 
set args 参数:指定运行时的参数 
show args:查看设置好的参数 
info program: 来查看程序的是否在运行,进程号,被暂停的原因


分割窗口


layout:用于分割窗口,可以一边查看代码,一边测试: 
layout src:显示源代码窗口 
layout asm:显示反汇编窗口 
layout regs:显示源代码/反汇编和CPU寄存器窗口 
layout split:显示源代码和反汇编窗口 
Ctrl + L:刷新窗口


=====================================================================================================================
----------------------------高级调试-------------------------
=====================================================================================================================


1.按TAB键两次会将命令或者函数名补齐


2.设置断点
  break function
  break linenum
  break +offset                                当前行号前offset行
  break -offset                                 当前行号后offset行
  break *address                             运行内存地址处停止
  break                                            下一行
  break ... if condition ...                  可以是上述参数


3.设置观察点
  watch  expr                                   变量有变化停止
  rwatch expr                                   变量被读停止
  awatch expr                                  变量被读写时停止


4.设置捕捉点
  catch event
  event有如下:
  throw  catch  exec  fork vfork load unload


CODE:
Raised signals may be caught:
        catch signal                            - all signals
        catch signal <signame>         - a particular signal
Raised exceptions may be caught:
        catch throw                           - all exceptions, when thrown
        catch throw <exceptname>  - a particular exception, when thrown
        catch catch                            - all exceptions, when caught
        catch catch <exceptname>   - a particular exception, when caught
Thread or process events may be caught:
        catch thread_start                - any threads, just after creation
        catch thread_exit                  - any threads, just before expiration
        catch thread_join                  - any threads, just after joins
Process events may be caught:
        catch start                            - any processes, just after creation
        catch exit                              - any processes, just before expiration
        catch fork                              - calls to fork()
        catch vfork                            - calls to vfork()
        catch exec                             - calls to exec()
Dynamically-linked library events may be caught:
        catch load                            - loads of any library
        catch load <libname>          - loads of a particular library
        catch unload                        - unloads of any library
        catch unload <libname>      - unloads of a particular library
The act of your program's execution stopping may also be caught:
        catch stop
C++ exceptions may be caught:
        catch throw                        - all exceptions, when thrown
        catch catch                         - all exceptions, when caught
  


6.其他有用的指令
  finish 运行程序,直到当前函数完成
  until或u运行程序直到退出循环体,用在for或者while上,比较方便
x命令增加如下


CODE:
Examine memory: x/FMT ADDRESS.
ADDRESS is an expression for the memory address to examine.
FMT is a repeat count followed by a format letter and a size letter.
Format letters are o(octal), x(hex), d(decimal), u(unsigned decimal),
  t(binary), f(float), a(address), i(instruction), c(char) and s(string).
Size letters are b(byte), h(halfword), w(word), g(giant, 8 bytes).
The specified number of objects of the specified size are printed
according to the format.


Defaults for format and size letters are those previously used.
Default count is 1.  Default address is following last thing printed
with this command or "print".


 


==========================================================
                                            gdb 命令大全


帮助:
help    显示帮助
info    显示程序状态
set     修改
show    显示gdb状态




线程操作:
info threads    #   查看所有线程信息
thread 线程id #   切换到指定线程
thread apply [threadno | all ] 参数     #   对所有线程都应用某个命令


子进程调试:
set follow-fork-mode child|parent   #   fork后,需要跟踪谁
show follow-fork-mode
set detach-on-flow on|off           #   fork后,需要两个都跟踪吗


info forks                          #   显示所有进程信息
fork 进程id                         #   切换到某个进程
detach-fork 进程id                  #   不再跟踪某个进程
delete fork 进程id                  #   kill某个进程并停止对它的跟踪




查看停止原因:
info program


break(b)    行号|函数名|程序地址 | +/-offset | filenam:func   [if 条件]   #   在指定位置设置断点
tbreak      ...     #   与break相似,只是设置一次断点
hbreak      ...     #   与break相似,只是设置硬件断点,需要硬件支持
thbreak     ...     #   与break相似,只是设置一次性硬件断点,需要硬件支持




set breadpoint pending auto|on|off #   查看如果断点位置没有找到时行为
show breakpoint pending








set can-use-hw-watchpoints 值 #   设置使用的硬件观察点的数
show can-use-hw-watchpoints


rwatch与awatch需要有硬件支持,另外如果是对局部变量使用watchpoint,那退出作用域时观察点会自动被删除
另外在多线程情况下,gdb的watchpoint只对一个线程有效




捕获点(catchpoint): 程序发生某个事件时停止,如产生异常时


catch   事件名
事件包括:
throw           #   产生c++异常
catch           #   捕获到c++异常
exec/fork/vfork #   一个exec/fork/vfork函数调用,只对HP-UX
load/unload    [库名] #   加载/卸载共享库事件,对只HP-UX
tcatch 事件名          #   一次性catch
info    break






断点后操作:
continue(c) [忽略次数] #   继续执行,[忽略前面n次中断]
fg          [忽略次数] #   继续执行,[忽略前面n次中断]


step(s)     [n步]       #   步进,重复n次
next(n)     [n步]       #   前进,重复n次


finish                  #   完成当前函数调用,一直执行到返回处,并打印返回值


until(u)    [位置]      #   一直执行到当前行或指定位置,或是当前函数返回
advance     位置        #   前面到指定位置,如果当前函数返回则停止,与until类似


stepi(si)   [n步]       #   精确的只执行一个汇编指令,重复n次
nexti(ni)   [n步]       #   精确的只执行一个汇编指令,碰到函数跳过,重复n次


set step-mode   on|off #   on时,如果函数没有调试信息也跟进
show step-mode


信号:
info signals            #   列出所有信号的处理方式
info handle             #   同上


handle 信号    方式    #   改变当前处理某个信号的方式
方式包括:
nostop #   当信号发生时不停止,只打印信号曾经发生过
stop    #   停止并打印信号
print   #   信号发生时打印
noprint #   信号发生时不打印
pass/noignore # gdb充许应用程序看到这个信号
nopass/ignore # gdb不充许应用程序看到这个信号




线程调度锁:
set scheduler-locking on|off    #   off时所有线程都可以得到调度,on时只有当前
show scheduler-locking


帧:
frame(f) [帧号]     #   不带参数时显示所有帧信息,带参数时切换到指定帧
frame   地址        #   切换到指定地址的帧
up      [n]         #   向上n帧
down    [n]         #   向下n帧


select-frame   帧号 #   切换到指定帧并且不打印被转换到的帧的信息
up-silently [n]     #   向上n帧,不显示帧信息
down-silently [n]   #   向下n帧,不显示帧信息


调用链:
backtrace(bt)   [n|-n|full] #   显示当前调用链,n限制显示的数目,-n表示显示后n个,n表示显示前n个,full的话还会显示变量信息
使用 thread apply all bt 就可以显示所有线程的调用信息


set backtrace past-main on|off 
show backtrace past-main


set backtrace past-entry on|off 
show backtrace past-entry


set backtrace limit n           #   限制调用信息的显示层数
show backtrace limit






查看内存:
x   /nfu    地址    #   查看内存  
 
例如 x /4xw


输出格式:
x               #   16进制
d               #   10进制
u               #   无符号
o               #   8进制
t               #   2进制
a               #   地址
c               #   字符
f               #   浮点
n       重复n次
f       显示格式,为print使用的格式
u       每个单元的大小,为
b       byte
h       2 byte
w       4 byte
g       8 byte




查看变量历史:
show values 变量名 [n]     #   显示变量的上次显示历史,显示n条
show values 变量名 +       #   继续上次显示内容




寄存器:
into registers      #   除了浮点寄存器外所有寄存器
info all-registers #   所有寄存器
into registers 寄存器名     #   指定寄存器内容
info float          #   查看浮点寄存器状态
info vector         #   查看向量寄存器状态


gdb为一些内部寄存器定义了名字,
如$pc(指令),$sp(栈指针),$fp(栈帧),$ps(程序状态)
p /x $pc    #   查看pc寄存器当前值
x /i $pc    #   查看要执行的下一条指令
set $sp += 4 # 移动栈指针


内核中信息:
info udot       #   查看内核中user struct信息
info auxv       #   显示auxv内容(auxv是协助程序启动的环境变量的)




内存区域限制:
mem 起始地址 结构地址 属性 #   对[地始地址,结构地址)区域内存进行保护,如果结构地址为0表示地址最大值0xffffffff
delete mem 编号            #   删除一个内存保护
disable mem 编号            #   禁止一个内存保护
enable mem 编号             #   打开一个内存保护
info mem                    #   显示所有内存保护信息


保护的属性包括:
1. 内存访问模式:   ro | wo |rw
2. 内存访问大小:   8 | 16 | 32 | 64    如果不限制,表示可按任意大小访问
3. 数据缓存:       cache | nocache     cache表示充许gdb缓存目标内存


 


内存复制到/从文件:
dump [格式] memory 文件名 起始地址 结构地址 #   把指定内存段写到文件
dump [格式] value 文件名 表达式            #   把指定值写到文件
格式包括:
binary      原始二进制格式
ihex        intel 16进制格式
srec        S-recored格式
tekhex      tektronix 16进制格式


append [binary] memory 文件名 起始地址 结构地址 #   按2进制追加到文件
append [binary] value 文件名 表达式             #   按2进制追加到文件


restore 文件名 [binary] bias 起始地址 结构地址 #   恢复文件中内容到内存.如果文件内容是原始二进制,需要指定binary参数,不然会gdb自动识别文件格式




产生core dump文件
gcore   [文件名]    #   产生core dump文件


字符集:
set target-charset 字符集   # 声明目标机器的locale,如gdbserver所在机器
set host-charset 字符集     # 声明本机的locale
set charset     字符集      # 声明目标机和本机的locale
show charset
show host-charset
show target-charset




缓存远程目标的数据:为提高性能可以使用数据缓存,不过gdb不知道volatile变量,缓存可能会显示不正确的结构
set remotecache on | off
show remotecache 
info dcache         #   显示数据缓存的性能


C预处理宏:
macro expand(exp) 表达式        #   显示宏展开结果
macro expand-once(expl) 表达式 #   显示宏一次展开结果
macro info 宏名                 #   查看宏定义




tdump                   #   显示当前记录中追踪信息
save-tracepoints 文件名 #   保存追踪信息到指定文件,后面使用source命令读


追踪中的便利变量:
$trace_frame            #   当前帧编号, -1表示没有, INT
$tracepoint             #   当前追踪,INT
$trace_line             #   位置    INT
$trace_file             #   追踪文件 string, 需要使用output输出,不应用printf
$trace_func             #   函数名 string


覆盖技术(overray): 用于调试过大的文件


gdb文件:
file    文件名          #   加载文件,此文件为可执行文件,并且从这里读取符号
core    文件名          #   加载core dump文件
exec-file   文件名      #   加载可执行文件
symbol-file 文件名      #   加载符号文件
add-symbol-file 文件名 地址 #   加载其它符号文件到指定地址
add-symbol-file-from-memory 地址    #   从指定地址中加载符号
add-share-symbol-files 库文件   #   只适用于cygwin
session 段 地址         #   修改段信息
info files | target     #   打开当前目标信息
maint info sections     #   查看程序段信息
set truct-readonly-sections on | off #   加快速度
show truct-readonly-sections


set auto-solib-add on | off    #   修改自动加载动态库的模式
show auto-solib-add
0 0
原创粉丝点击