gdb MI命令中文
GDB常用命令

GDB常用命令在linux的c编程中大家经常用gdb调试程序,以下是一些常用的指令1.break FUNCTION在某个函数上设置断点。
函数重载时,有可能同时在几个重载的函数上设置了断点break +OFFSETbreak -OFFSET在当前程序运行到的前几行或后几行设置断点break LINENUM在行号为LINENUM的行上设置断点break FILENAME:LINENUM在文件名为FILENAME的原文件的第LINENUM行设置断点break FILENAME:FUNCTION在文件名为FILENAME的FUNCTION函数上设置断点当你的多个文件中可能含有相同的函数名时必须给出文件名。
break *ADDRESS在地址ADDRESS上设置断点,这个命令允许你在没有调试信息的程序中设置断点break当break命令不包含任何参数时,break命令在当前执行到的程序运行栈中的下一条指令上设置一个断点。
除了栈底以外,这个命令使程序在一旦从当前函数返回时停止。
相似的命令是finish,但finish并不设置断点。
这一点在循环语句中很有用。
gdb在恢复执行时,至少执行一条指令。
break ... if COND这个命令设置一个条件断点,条件由COND指定;在gdb每次执行到此断点时COND都被计算当COND的值为非零时,程序在断点处停止ignore BNUM COUNT设置第BNUM号断点的被忽略的次数为COUNT,即断点BNUM 再执行到第COUNT+1次时程序停止tbreak ARGS 或者简写为 tb设置断点为只有效一次。
ARGS的使用同break中的参量的使用hbreak ARGS设置一个由硬件支持的断点。
这个命令的主要目的是用于对EPROM/ROM程序的调试因为这条命令可以在不改变代码的情况下设置断点。
这可以同SPARCLite DSU一起使用。
当程序访问某些变量和代码时,DSU将设置“陷井”。
GDB命令大全

GDB命令大全GDB的使用当程序出错并产生core 时快速定位出错函数的办法gdb 程序名 core文件名(一般是core,也可能是core.xxxx) 调试程序使用的键r run 运行.程序还没有运行前使用c cuntinue 继续运行。
运行中断后继续运行q 退出kill 终止调试的程序h help 帮助<tab> 命令补全功能step 跟入函数next 不跟入函数b breakpoint 设置断点。
用法:b 函数名对此函数进行中断b 文件名:行号对此文件中指定行中断.如果是当前文件,那么文件名与:号可以省略看当前断点数使用info break.禁止断点disable 断点号.删除delete 断点号.l list 列出代码行。
一次列10 行。
连接使用list将会滚动显示. 也可以在list 后面跟上文件名:行号watch 观察一个变量的值。
每次中断时都会显示这个变量的值p print 打印一个变量的值。
与watch不同的是print只显示一次这里在顺便说说如何改变一个 value. 当你下指令 p 的时候,例如你用 p b,这时候你会看到 b 的 value, 也就是上面的 $1 = 15.你也同样可以用 p 来改变一个 value, 例如下指令 p b = 100 试试看,这时候你会发现, b 的 value 就变成 100 了:$1 = 100.网上抄录基本的使用方法简介前言程序代码中的错误可分为数类,除了最容易除错的语法错误,编译程序会告诉你错误所在外,大部分的错误都可以归类为执行时错误。
GDB 的功能便是寻找执行时错误。
如果没有除错程序,我们只能在程序中加入输出变量值的指令来了解程序执行的状态。
有了 GDB 除错程序,我们可以设定在任何地方停止程序的执行,然后可以随意检视变量值及更动变量,并逐行执行程序。
一个除错程序执行的流程通常是这样的:1. 进入除错程序并指定可执行文件。
gdb命令大全

gdb命令大全gdb 命令大全2011-06-22 21:44 155人阅读评论(0) 收藏举报gdb 命令1.按TAB键两次会将命令或者函数名补齐2.设置断点break functionbreak linenumbreak +offset 当前行号前offset行break -offset 当前行号后offset行break *address 运行内存地址处停止break 下一行break ... if condition ... 可以是上述参数3.设置观察点watch expr 变量有变化停止rwatch expr 变量被读停止awatch expr 变量被读写时停止4.设置捕捉点catch eventevent有如下:throw catch exec fork vfork load unloadCODE:Raised signals may be caught:catch signal - all signalscatch signal <signame> - a particular signalRaised exceptions may be caught:catch throw - all exceptions, when throwncatch throw <exceptname> - a particular exception, when throwncatch catch - all exceptions, when caughtcatch catch <exceptname> - a particular exception, when caughtThread or process events may be caught:catch thread_start - any threads, just after creation catch thread_exit - any threads, just before expirationcatch thread_join - any threads, just after joinsProcess events may be caught:catch start - any processes, just after creationcatch exit - any processes, just before expirationcatch 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 librarycatch load <libname> - loads of a particular librarycatch unload - unloads of any librarycatch unload <libname> - unloads of a particular library The act of your program's execution stopping may also be caught:catch stopC++ exceptions may be caught:catch throw - all exceptions, when throwncatch catch - all exceptions, when caught4.停止条件维护可以用condition命令来修改断点的条件,目前只有break watchcondition <bnum> <expression>condition <bnum> 清除停止条件5.为停止点设定运行命令可以用commands命令来设置commands <bnum>.....end6.其他有用的指令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 printedaccording to the format.Defaults for format and size letters are those previously used.Default count is 1. Default address is following last thingwith this command or "print".====================================== ====================gdb 命令大全1. 启动gdb 应用程序名gdb 应用程序名 core文件名gdb 应用程序名 pidgdb --args 应用程序名应用程序的运行参数帮助:help 显示帮助info 显示程序状态set 修改show 显示gdb状态运行及运行环境设置:set args # 设置运行参数show args # 显示运行参数set env 变量名 = 值 # 设置环境变量unset env [变量名] # 取消环境变量show env [变量名] # 显示环境变量path 目录名 # 把目录添加到查找路径中show paths # 显示当前查找路径cd 目录 # 切换工作目录pwd # 显示当前工作目录tty /dev/pts/1 # 修改程序的输入输出到指定的ttyset inferior-tty /dev/pts/1 # 修改程序的输出到指定的ttyshow inferior-ttyshow ttyrun 参数 # 运行start 参数 # 开始运行,但是会在main函数停止attach piddetachkill # 退出Ctrl-C # 中断(SIGINT)Ctrl-]线程操作:info threads # 查看所有线程信息thread 线程id # 切换到指定线程thread apply [threadno | all ] 参数 # 对所有线程都应用某个命令子进程调试:set follow-fork-mode child|parent # fork后,需要跟踪谁show follow-fork-modeset detach-on-flow on|off # fork后,需要两个都跟踪吗info forks # 显示所有进程信息fork 进程id # 切换到某个进程detach-fork 进程id # 不再跟踪某个进程delete fork 进程id # kill某个进程并停止对它的跟踪检查点: checkpoint/restart查看停止原因:info program断点(breakpoint): 程序运行到某处就会中断break(b) 行号|函数名|程序地址 | +/-offset | filenam:func [if条件] # 在指定位置设置断点tbreak ... # 与break相似,只是设置一次断点hbreak ... # 与break相似,只是设置硬件断点,需要硬件支持thbreak ... # 与break相似,只是设置一次性硬件断点,需要硬件支持rbreak 正则表达式 # 给一批满足条件的函数打上断点info break [断点号] # 查看某个断点或所有断点信息set breadpoint pending auto|on|off # 查看如果断点位置没有找到时行为show breakpoint pending观察点(watchpoint): 表达式的值修改时会被中断watch 表达式 # 当表达式被写入,并且值被改变时中断rwatch 表达式 # 当表达式被读时中断awatch 表达式 # 当表达式被读或写时中断info watchpointsset can-use-hw-watchpoints 值 # 设置使用的硬件观察点的数show can-use-hw-watchpointsrwatch与awatch需要有硬件支持,另外如果是对局部变量使用watchpoint,那退出作用域时观察点会自动被删除另外在多线程情况下,gdb的watchpoint只对一个线程有效捕获点(catchpoint): 程序发生某个事件时停止,如产生异常时catch 事件名事件包括:throw # 产生c++异常catch # 捕获到c++异常exec/fork/vfork # 一个exec/fork/vfork函数调用,只对HP-UX load/unload [库名] # 加载/卸载共享库事件,对只HP-UXtcatch 事件名 # 一次性catchinfo break断点操作:clear [函数名|行号] # 删除断点,无参数表示删卫当前位置delete [断点号] # 删除断点,无参数表示删所有断点disable [断点号]enable [断点号]condition 断点号条件 # 增加断点条件condition 断点号 # 删除断点条件ignore 断点号数目 # 忽略断点n次commands 断点号 # 当某个断点中断时打印条件条件end下面是一个例子,可以一直打印当前的X值:commands 3printf "X:%d/n",xcontend断点后操作: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不充许应用程序看到这个信号线程断点:break 行号信息 thread 线程号 [if 条件] # 只在某个线程内加断点线程调度锁: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|offshow backtrace past-mainset backtrace past-entry on|offshow backtrace past-entryset backtrace limit n # 限制调用信息的显示层数show backtrace limit显示帧信息:info frame # 显示当前帧信息info frame addr # 显示指定地址的帧信息info args # 显示帧的参数info locals # 显示局部变量信息info catch # 显示本帧异常信息显示行号:list(l) [行号|函数|文件:行号] # 显示指定位置的信息,无参数为当前位置list - # 显示当前行之前的信息list first,last # 从frist显示到last行list ,last # 从当前行显示到last行list frist, # 从指定行显示list + # 显示上次list后显示的内容list - # 显示上次list前面的内容在上面,first和last可以是下面类型:行号+偏移-偏移文件名:行号函数名函数名:行号set listsize n # 修改每次显示的行数show listsize编辑:edit [行号|函数|函数名:行号|文件名:函数名] # 编辑指定位置查找:search 表示式 # 向前查找表达式reverse-search 表示式 # 向后查找表达式指定源码目录:directory(dir) [目录名] # 指定源文件查找目录show directories源码与机器码:info line [函数名|行号] # 显示指定位置对应的机器码地址范围disassemble [函数名 | 起始地址结束地址] # 对指定范围进行反汇编set disassembly-flavor att|intel # 指定汇编代码形式show disassembly-flavor查看数据:ptype 表达式 # 查看某个表达式的类型print [/f] [表达式] # 按格式查看表达式内容,/f是格式化set print address on|off # 打印时是不是显示地址信息show print addressset print symbol-filename on|off # 是不是显示符号所在文件等信息show print symbol-filenameset print array on | off # 是不是打印数组show print arrayset print array index on | off # 是不是打印下标show print array index...表达式可以用下面的修饰符:var@n # 表示把var当成长度为n的数组filename::var # 表示打印某个函数内的变量,filename可以换成其它范围符如文件名{type} var # 表示把var当成type类型输出格式:x # 16进制d # 10进制u # 无符号o # 8进制t # 2进制a # 地址c # 字符f # 浮点查看内存:x /nfu 地址 # 查看内存n 重复n次f 显示格式,为print使用的格式u 每个单元的大小,为b byteh 2 bytew 4 byteg 8 byte自动显示:display [/fmt] 表达式 # 每次停止时都会显示表达式,fmt与print 的格式一样,如果是内存地址,那fmt可像 x的参数一样undisplay 显示编号delete display 显示编号 # 这两个都是删附某个显示disable display 显示编号 # 禁止某个显示enable display 显示编号 # 重显示display # 显示当前显示内容info display # 查看所有display项查看变量历史:show values 变量名 [n] # 显示变量的上次显示历史,显示n条show values 变量名 + # 继续上次显示内容便利变量: (声明变量的别名以方便使用)set $foo = *object_ptr # 声明foo为object_ptr的便利变量init-if-undefined $var = expression # 如果var还未定义则赋值show convenience内部便利变量:$_ 上次x查看的地址$__$_exitcode 程序垢退出码寄存器: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 |rw2. 内存访问大小: 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 字符集 # 声明本机的localeset charset 字符集 # 声明目标机和本机的localeshow charsetshow host-charsetshow target-charset缓存远程目标的数据:为提高性能可以使用数据缓存,不过gdb不知道volatile变量,缓存可能会显示不正确的结构set remotecache on | offshow remotecacheinfo dcache # 显示数据缓存的性能C预处理宏:macro expand(exp) 表达式 # 显示宏展开结果macro expand-once(expl) 表达式 # 显示宏一次展开结果macro info 宏名 # 查看宏定义追踪(tracepoint): 就是在某个点设置采样信息,每次经过这个点时只执行已经定义的采样动作但并不停止,最后再根据采样结果进行分析。
gdb使用教程

gdb使用教程GDB是GNU调试器的缩写,是一个功能强大的命令行调试工具,用于帮助开发人员在调试过程中定位和修复程序中的错误。
以下是GDB的使用教程:1. 编译程序时添加调试信息:在使用GDB进行调试之前,需要确保程序在编译时包含了调试信息。
可以通过在编译命令中添加`-g`选项来实现。
例如:`gcc -g main.c -o main`。
2. 启动GDB:在命令行中输入`gdb`命令,然后输入可执行文件的路径作为参数。
例如:`gdb ./main`。
3. 设置断点:断点是在程序执行到指定位置时停下来的标记。
可以使用`break`命令来设置断点。
例如:`break main`可以在`main`函数的开头设置一个断点。
4. 开始执行程序:使用`run`命令来运行程序。
例如:`run`。
5. 执行程序并停在断点处:当程序开始运行后,会在达到断点处停下来等待输入。
此时可以使用一些GDB命令来检查程序的状态,如查看变量的值、栈帧等。
6. 单步执行:使用`next`命令来逐行执行程序。
例如:`next`。
7. 跳出函数:使用`finish`命令可以跳出当前正在执行的函数,并停在调用该函数的上一个函数中。
8. 继续执行:使用`continue`命令可以接着执行程序直到下一个断点或程序结束。
9. 查看变量的值:使用`print`或简写的`p`命令可以查看变量的值。
例如:`print i`可以查看变量`i`的值。
10. 修改变量的值:使用`set`命令可以修改变量的值。
例如:`set i = 10`可以将变量`i`的值修改为10。
11. 查看函数调用栈:使用`backtrace`或简写的`bt`命令可以查看函数调用栈。
12. 退出GDB:使用`quit`命令可以退出GDB。
以上是一些常用的GDB命令,使用GDB进行调试时还有很多其他的功能和命令可以使用,可以通过阅读GDB的文档来更详细地了解。
gdb 汇编常见命令

gdb 汇编常见命令1.引言1.1 概述概述部分的内容可以简要介绍一下gdb和汇编语言的概念。
GDB是GNU Debugger的缩写,是一个功能强大的调试工具,用于帮助开发人员调试程序。
它可以与众多编程语言一起使用,包括汇编语言。
汇编语言是一种低级别的程序设计语言,用于直接操作计算机硬件。
本文将重点介绍gdb在汇编语言中的常见命令。
通过熟悉这些命令,开发人员可以更好地理解和调试汇编程序,提高程序的运行效率和稳定性。
文章后续部分将详细介绍常见的gdb命令和它们在汇编程序中的应用场景。
首先,我们将介绍常见命令1,在此命令中,我们将学习如何设置断点、单步执行程序、查看寄存器的值等。
然后,我们将进一步探讨常见命令2,该命令将介绍如何查看内存中的数据、修改内存值以及使用条件断点等。
通过本文,读者将能够掌握这些常见的gdb命令,并能够熟练运用它们进行汇编程序的调试。
最后,在结论部分,我们将对本文进行总结,并展望未来gdb在汇编语言调试中的应用前景。
接下来,我们将详细介绍2.1 常见命令1部分的内容。
1.2 文章结构文章结构部分的内容可以参考以下内容:文章结构部分介绍了整篇文章的组织结构和内容安排,旨在为读者提供一个清晰的框架和导引,使读者能够更好地理解和掌握文章内容。
在本文中,结构主要分为三个部分:引言、正文和结论。
引言部分首先对文章的主题进行了概述,简要介绍了gdb汇编调试工具的基本概念和作用。
接着,介绍了本文的结构,包括引言、正文和结论三个部分以及各个部分的内容安排。
最后,明确了本文的目的,旨在帮助读者掌握gdb汇编调试工具的常见命令。
正文部分是本文的核心内容,主要介绍了gdb汇编调试工具的常见命令。
这些命令包括但不限于断点设置、步进执行、变量查看、寄存器查看等。
每个命令都会详细解释其作用和用法,并通过实例进行演示,以便读者能够更好地理解和掌握。
结论部分对整篇文章进行总结,并展望了未来可能的研究方向和进一步探索的问题。
GDB命令

GDB的命令很多,先介绍一些最常用的。
在介绍之前,先介绍GDB中的一个非常有用的功能:补齐功能。
它就如同Linux下SHELL中的命令补齐一样。
当你输入一个命令的前几个字符,然后输入TAB键,如果没有其它命令的前几个字符与此相同,SHELL将补齐此命令。
如果有其它命令的前几个字符与此相同,你会听到一声警告声,再输入TAB键,SHELL将所有前几个字符与此相同的命令全部列出。
而GDB中的补齐功能不仅能补齐GDB命令,而且能补齐参数。
先介绍常用的命令,然后结合一个具体的例子来演示如何实际使用这些命令。
下面的所有命令除了第一条启动GDB命令是在SHELL下输入的,其余都是GDB内的命令。
大部分GDB内的命令都可以仅输入前几个字符,只要不与其它指令冲突。
如quit可以简写为q,因为以q打头的命令只有quit。
List可以简写为l,等等。
1.启动GDB你可以输入GDB来启动GDB程序。
GDB程序有许多参数,在此没有必要详细介绍,但一个最为常用的还是要介绍的:如果你已经编译好一个程序,我们假设文件名为hello,你想用GDB调试它,可以输入gdb hello来启动GDB并载入你的程序。
如果你仅仅启动了GDB,你必须在启动后,在GDB中再载入你的程序。
2.载入程序=== file在GDB内,载入程序很简单,使用file命令。
如file hello。
当然,程序的路径名要正确。
退出GDB === quit在GDB的命令方式下,输入quit,你就可以退出GDB。
你也可以输入'C-d'来退出GDB。
3.运行程序=== run当你在GDB中已将要调试的程序载入后,你可以用run命令来执行。
如果你的程序需要参数,你可以在run指令后接着输入参数,就象你在SHELL下执行一个需要参数的命令一样。
4.查看程序信息=== infoinfo指令用来查看程序的信息,当你用help info查看帮助的话,info指令的参数足足占了两个屏幕,它的参数非常多,但大部分不常用。
GDB MI 命令介绍

GDB MI 命令介绍libgdb过时了,目前的GDB调试前端都不用libgdb目前有两种比较流行:- MI接口,现在应该是MI II接口,是Eclipse CDT所采用的方式- emac输出接口,这个似乎有更多的调试前端所采用,例如DDD,kdbg,codeblocks等等另外还有一种比较另类的一种方式:insight,直接把gdb给包含进去了=========================================GDB MI Interface虽然使用GDB已经很多年了,但是直到最近因为工作需要才知道GDB除了CLI(Commnad LineInterface)命令外,还有一个更重要的MI (Machine Interface)命令。
之所以“更重要”,因为MI不但包括了CLI 的所有命令,还具备一些CLI所不提供的功能。
当然,MI 接口的设计初衷是面向将GDB作为系统组件之一的复杂系统。
在类似于DDD,Insight 等以GDB为backend的GUIdebugger的实现中,就是充分利用了GDBMI接口。
MI最大的不足在于其输出比较复杂,必须很熟悉其输出格式才能理解,不如CLI输出直观。
但这只是习惯问题,多用多读自然就OK啦。
简单地说,GDB MI interpreter接受字符串形式的命令输入,然后产生一行表示命令执行结果的输出。
当然,这里的输入命令和输出记录都有严格的格式和内容定义。
而且,根据命令的不同(同步命令或异步命令),GDB的输出也代表不同的含义。
当利用GDBMI实现一个GUI的debugger时,通常的做法是使用一个进程负责管理GDB,将GDB作为其子进程派生出来后,接管其标准I/O,并通过pipe向GDB注入MI命令,并接收GDB MI输出。
自然,该进程的另一个工作就是与GUI前端交互,完成GUI命令解析以及返回相应record.Insight使用Tcl/tk实现前端GUI,DDD使用的则是Gtk。
gdb 带命令行选项的参数

gdb 带命令行选项的参数详解GDB(GNU Debugger)是一个用于调试程序的强大工具,它允许你在程序执行过程中观察程序的状态、检查变量的值,以及定位和修复错误。
你可以在命令行中使用一些选项来配置GDB 的行为。
以下是一些常见的GDB 命令行选项:1. 指定要调试的程序:```gdb [program]```这是最基本的用法,`program` 是你要调试的可执行文件的名称。
2. 指定核心转储文件:```gdb [program] core```如果程序崩溃并生成了核心转储文件,你可以使用该选项来调试核心转储文件。
3. 加载符号文件:```gdb [program] -s [symbol-file]```使用`-s` 选项可以指定符号文件,这对于调试没有调试信息的二进制文件很有用。
4. 指定启动参数:```gdb --args [program] [args...]```使用`--args` 选项可以将参数传递给正在调试的程序。
5. 使用批处理模式:```gdb -batch -ex "command1" -ex "command2" [program]````-batch` 选项可以使GDB 在执行完指定命令后立即退出。
`-ex` 选项用于指定在启动GDB 后要执行的命令。
6. 使用交互式Shell:```gdb -i=mi [program]````-i=mi` 选项启用了GDB 的机器接口模式,这对于与其他程序(如IDE)进行集成很有用。
7. 设置断点:```gdb -ex "break [function]" [program]```使用`-ex` 选项可以在启动时设置断点。
8. 设置环境变量:```gdb [program] --eval-command="set environment VARNAME=VALUE"```使用`--eval-command` 选项可以在启动时设置GDB 命令。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
GDB MI的命令总共分为以下几个部分:1.断点(Breakpoint)2.程序环境(Program Context)3.线程(Thread)4.程序执行(Program Execution)5.栈(Stack)6.变量(Variable)7.数据(Data)8.跟踪点(Tracepoint)9.符号(Symbol)10.文件(File)11.目标数据(Target Manipulation)12.其它杂项我们以下面这段代码为例演示各种命令的执行结果:/*** demo.c*/#include <stdio.h>int swap(int a[], int len){int i;int temp;for(i = 0; i < len / 2; i++){temp = a[i];a[i] = a[len - i - 1];a[len - i - 1] = temp;}return 0;}int main(){int array[10];int i;for(i = 0; i < 10; i++)array[i] = i;printf("swap before:");for(i = 0; i < 10; i++)printf("%d ", array[i]);printf(" \n");swap(array, 10);printf("swap after:");for(i = 0; i < 10; i++)printf("%d ", array[i]);printf(" \n");return 0;}执行gcc -g demo.c -o demo.exe编译。
具体详细的命令还请大家看gdb手册,下面一一介绍:1.断点-break-after用法:-break-after number count语义:第number个断点在被执行count次后有效-break-condition用法:-break-condition number expr语义:第number个断点在表达式expr为true时有效-break-delete用法:-break-delete ( breakpoint number )+语义:删除指定number 的多个断点-break-disable用法:-break-disable ( breakpoint number)+语义:使指定number的多个断点失效-break-enable用法:-break-enable ( breakpoint number)+语义:使指定number的多个断点起效-break-info用法:-break-info breakpoint语义:得到指定断点的信息-break-insert用法:-break-insert [ -t ] [ -h ] [ -r ][ -c condition ] [ -i ignore-count ][ -p thread ] [ line | addr ]语义:-t 插入一个临时断点-h 插于一个硬件端点-r 插入一个正则断点,当函数名匹配正则表达式时有效-c 插入一个条件断点-i 插入一个指定无效次数的断点如果指定了line选项,可以使用如下格式:函数文件名:行号文件名:函数地址-break-list用法:-break-list语义:先是已插入断点的列表-break-watch用法:-break-watch [ -a | -r ] variable语义:创建一个观察点,-a表示对variable读写时有效,-r表示只读时有效运行效果:(gdb)-break-insert main^done,bkpt={number="1",type="breakpoint",disp="keep",enabled="y",addr="0x0040 10f6",func="main",file="demo.c",line="23",times="0"}(gdb)-break-insert 28^done,bkpt={number="2",type="breakpoint",disp="keep",enabled="y",addr="0x0040 1108",func="main",file="demo.c",line="28",times="0"}(gdb)-break-list^done,BreakpointTable={nr_rows="2",nr_cols="6",hdr=[{width="3",alignment="-1", col_name="number",colhdr="Num"},{width="14",alignment="-1",col_name="type",col hdr="Type"},{width="4",alignment="-1",col_name="disp",colhdr="Disp"},{width="3",ali gnment="-1",col_name="enabled",colhdr="Enb"},{width="10",alignment="-1",col_na me="addr",colhdr="Address"},{width="40",alignment="2",col_name="what",colhdr="W hat"}],body=[bkpt={number="1",type="breakpoint",disp="keep",enabled="y",addr="0x0 04010f6",func="main",file="demo.c",line="23",times="0"},bkpt={number="2",type="br eakpoint",disp="keep",enabled="y",addr="0x00401108",func="main",file="demo.c",lin e="28",times="0"}]}(gdb)-exec-run^running(gdb)*stopped,reason="breakpoint-hit",bkptno="1",thread-id="1",frame={addr="0x004010 f6",func="main",args=[],file="demo.c",line="23"}(gdb)-exec-continue^running(gdb)*stopped,reason="breakpoint-hit",bkptno="2",thread-id="1",frame={addr="0x004011 08",func="main",args=[],file="demo.c",line="28"}(gdb)-break-delete 1^done(gdb)2.程序环境-exec-arguments用法:-exec-arguments args语义:设置程序命令行参数-exec-show-arguments用法:-exec-show-arguments语义:显示命令行参数-environment-cd用法:-environment-cd pathdir语义:设置GDB的工作目录-environment-directory用法:-environment-directory [ -r ] [ pathdir ]+语义:添加一个或多个pathdir到源文件的搜索路径,如果"-r"被指定,pathdir将被设为缺省的搜索路径-environment-path用法:-environment-path [ -r ] [ pathdir ]+语义:添加一个或多个pathdir到目标文件的搜索路径,如果"-r"被指定,pathdir 将被设为GDB启动时的搜索路径-environment-pwd用法:-environment-pwd语义:显示当前工作目录3.线程-thread-info语义:-thread-list-ids用法:-thread-list-ids语义:产生一个GDB当前已知线程的链表-thread-select用法:-thread-select threadnum语义:使threadnum成为当前线程效果如下:(gdb)-thread-list-ids^done,thread-ids={thread-id="3",thread-id="1"},number-of-threads="2"(gdb)-thread-select 1^done,new-thread-id="1",frame={level="0",func="main",args=[],file="demo.c",line= "27"},line="27",file="demo.c"(gdb)4. 程序执行这些命令都是异步命令-exec-continue用法:-exec-continue语义:继续执行程序,直到有断点或者程序退出-exec-finish用法:-exec-finish语义:将当前函数执行完毕-exec-interrupt用法:-exec-interrupt语义:中止正在执行的程序-exec-next用法:-exec-next语义:执行一行源代码-exec-next-instruction用法:-exec-next-instruction语义:执行一条机器指令-exec-return用法:-exec-return语义:中止当前函数的执行,立即返回-exec-run用法:-exec-run语义:开始执行程序,直到遇到断点或退出-exec-step用法:-exec-step语义:执行到下一个源代码行,如果此行是函数调用,则停留在调用函数的开始处-exec-step-instruction用法:-exec-step-instruction语义:执行一条机器指令-exec-until用法:-exec-until [ location ]语义:一直执行,直到达到location5. 栈-stack-info-frame尚没实现-stack-info-depth用法:-stack-info-depth [ max-depth ]语义:显示栈深度,如果指定了max-depth,超过max-depth的帧不会被计算-stack-list-arguments用法:-stack-list-arguments show-values[ low-frame high-frame ]语义:显示帧参数,show-values为0只显示参数名称,为1显示名称和值,如果指定了low-frame,high-frame则只显示它们之间的参数-stack-list-frames用法:-stack-list-frames [ low-frame high-frame ]语义:列举所有帧,如果指定low-frame和high-frame则只显示它们之间的帧-stack-list-locals用法:-stack-list-locals print-values语义:显示当前帧的本地变量,如果print-values为0,只显示变量名称,为1显示名称和值-stack-select-frame用法:-stack-select-frame framenum语义:选择framenum帧为当前帧效果如下:6.变量-var-create用法:-var-create {name | "-"} {frame-addr | "*"} expression语义:创建一个变量对象name表示变量名,如果指定"-",变量名将被自动创建frame-addr表示创建变量所在帧的基址expression可以有三种:地址,地址块,寄存器-var-delete用法:-var-delete name语义:删除名为name的变量对象-var-set-format用法:-var-set-format name format-spec语义:设置名为name的变量的输出格式format-spec ==>{binary | decimal | hexadecimal | octal | natural}-var-show-format用法:-var-show-format name语义:查看名为name的变量的输出格式,格式只有上面format-spec指定的几种-var-info-num-children用法:-var-info-num-children name语义:查看名为name的变量的子变量数目-var-list-children用法:-var-list-children [print-values] name语义:查看名为name的变量的子变量,如果print-values为0或者--no-values 则只显示子变量名,如果为1或--all-values显示子变量名和值-var-info-type用法:-var-info-type name语义:查看名为name的变量的类型-var-info-expression用法:-var-info-expression name语义:查看名为name的变量的表达式,可返回的表达式语言之有三种:C,C++,JA V A-var-show-attributes用法:-var-show-attributes name语义:查看名为name的变量的属性,属性为{ { editable | noneditable } | TBD }-var-evaluate-expression用法:-var-evaluate-expression name语义:计算名为name的变量的表达式-var-assign用法:-var-assign name expression语义:将一个新的表达式赋给名为name的变量-var-update用法:-var-update name语义:更新名为name的变量值,即根据当前的内存或寄存器重新计算变量值效果如下:(gdb)-var-create i 1 2^done,name="i",numchild="0",type="int"(gdb)-var-create - 1 3^done,name="var2",numchild="0",type="int"(gdb)-var-delete var2^done,ndeleted="1"(gdb)-var-show-format i^done,format="natural"(gdb)-var-list-children 1 i^done,numchild="0"(gdb)-var-info-type i^done,type="int"(gdb)-var-info-expression i^done,lang="C",exp="2"(gdb)-var-show-attributes i^done,attr="editable"(gdb)-var-evaluate-expression i^done,value="2"(gdb)-var-update i^done,changelist=[{name="i",in_scope="true",type_changed="false"}] (gdb)7.数据-data-disassemble用法:-data-disassemble[ -s start-addr -e end-addr ]| [ -f filename -l linenum [ -n lines ] ]-- mode语义:反汇编某一块内存区,可以按以下两种方式指定内存区:1). 指定开始和结束地址,start-addr, end-addr2). 指定源文件名和行范围mode是显示格式,0显示反汇编代码,1混合显示反汇编和源代码-data-evaluate-expression用法:-data-evaluate-expression expr语义:计算表达式expr的值-data-list-changed-registers用法:-data-list-changed-registers语义:显示值有变化的寄存器列表-data-list-register-names用法:-data-list-register-names [ ( regno )+ ]语义:显示指定了号码的寄存器名字,如果没指定regno,则显示所有的寄存器名字列表-data-list-register-values用法:-data-list-register-values fmt [ ( regno )*]语义:显示寄存器的内容,fmt是值的显示格式,如下:de> xde> Hexadecimalde> ode> Octalde> tde> Binaryde> dde> Decimalde> rde> Rawde> Nde> Natural-data-read-memory用法:-data-read-memory [ -o byte-offset ]address word-format word-sizenr-rows nr-cols [ aschar ]语义:address指定开始地址,byte-offset指定从开始地址的偏移值,word-format每个字的显示格式,word-size每个字的长度nr-rows,nr-cols指定输出格式为几行几列效果如下:(gdb)-data-disassemble -s $pc -e "$pc + 20" -- 0^done,asm_insns=[{address="0x004010f6",func-name="main",offset="37",inst="call 0x401250<__main>"},{address="0x004010fb",func-name="main",offset="42",inst="movl$0x0,0xffffffc4(%ebp)"},{address="0x00401102",func-name="main",offset="49", inst="cmpl$0x9,0xffffffc4(%ebp)"},{address="0x00401106",func-name="main",offset="53",inst="jg 0x401119 <main+72>"},{address="0x00401108",func-name="main",offset="55",inst="mov 0xffffffc4(%ebp),%edx"}](gdb)-data-evaluate-expression &i^done,value="0x22eeac"(gdb)-data-list-register-values x 1 2 3 4^done,register-values=[{number="1",value="0x0"},{number="2",value="0x4c"},{nu mber="3",value="0x4"},{number="4",value="0x22ee70"}](gdb)-exec-next^running(gdb)*stopped,reason="end-stepping-range",thread-id="1",frame={addr="0x004010fb",fun c="main",args=[],file="demo.c",line="27"}(gdb)-data-list-changed-registers^done,changed-registers=["0","2","8","9"](gdb)-data-read-memory $pc x 2 3 2^done,addr="0x004010fb",nr-bytes="12",total-bytes="12",next-row="0x004010ff",pr ev-row="0x004010f7",next-page="0x00401107",prev-page="0x004010ef",memory=[{ addr="0x004010fb",data=["0x45c7","0x00c4"]},{addr="0x004010ff",data=["0x0000","0x83 00"]},{addr="0x00401103",data=["0xc47d","0x7f09"]}](gdb)以后的8、9等命令GDB大部分尚没实现,或很少使用,不再解释。