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

gdb基础命令GDB(GNU Debugger)是一个用于调试程序的强大工具,支持多种编程语言,包括C、C++等。
以下是一些常用的GDB基础命令:1. 启动程序:```gdb executable```在命令行中执行上述命令,其中`executable` 是你要调试的可执行文件的名称。
2. 设置断点:```break function_name```在指定的函数或代码行上设置断点,使程序在该处停止执行。
3. 运行程序:```run```启动程序并运行到第一个断点或程序结束。
4. 单步执行:```step```执行一行代码,如果有函数调用,则进入函数内部。
5. 下一步执行:```next```执行一行代码,不进入函数内部,即不跟踪函数调用。
6. 查看变量值:```print variable_name```打印指定变量的值。
7. 显示源代码:```list```显示当前执行位置周围的源代码。
8. 查看堆栈:```backtrace```打印函数调用的堆栈跟踪信息。
9. 跳转到指定行:```jump line_number```跳转到指定行开始执行代码。
10. 继续执行:```continue```继续执行程序直到遇到下一个断点。
11. 退出调试器:```quit```退出GDB。
这些是一些基础的GDB命令,用于在调试过程中控制程序的执行和检查程序状态。
你可以通过输入`help` 命令获取更多关于特定命令的详细信息,例如`help break` 会显示有关设置断点的详细信息。
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 命令。
gdb常用命令详解

一、显示源代码GDB 可以打印出所调试程序的源代码,当然,在程序编译时一定要加上-g的参数,把源程序信息编译到执行文件中。
不然就看不到源程序了。
当程序停下来以后,GDB会报告程序停在了那个文件的第几行上。
你可以用list命令来打印程序的源代码。
还是来看一看查看源代码的GDB命令吧。
list显示程序第linenum行的周围的源程序。
list显示函数名为function的函数的源程序。
list显示当前行后面的源程序。
list -显示当前行前面的源程序。
一般是打印当前行的上5行和下5行,如果显示函数是是上2行下8行,默认是10行,当然,你也可以定制显示的范围,使用下面命令可以设置一次显示源程序的行数。
set listsize设置一次显示源代码的行数。
show listsize查看当前listsize的设置。
list命令还有下面的用法:list ,显示从first行到last行之间的源代码。
list ,显示从当前行到last行之间的源代码。
list +往后显示源代码。
一般来说在list后面可以跟以下这们的参数:行号。
<+offset> 当前行号的正偏移量。
<-offset> 当前行号的负偏移量。
哪个文件的哪一行。
函数名。
哪个文件中的哪个函数。
<*address> 程序运行时的语句在内存中的地址。
二、搜索源代码不仅如此,GDB还提供了源代码搜索的命令:forward-searchsearch向前面搜索。
reverse-search全部搜索。
其中,就是正则表达式,也主一个字符串的匹配模式,关于正则表达式,我就不在这里讲了,还请各位查看相关资料。
三、指定源文件的路径某些时候,用-g编译过后的执行程序中只是包括了源文件的名字,没有路径名。
GDB提供了可以让你指定源文件的路径的命令,以便GDB进行搜索。
directorydir加一个源文件路径到当前路径的前面。
如果你要指定多个路径,UNIX下你可以使用“:”,Windows下你可以使用“;”。
GDB基本命令(整合)

GDB基本命令(整合)一、gdb调试基本知识a.调试器指示的是将要执行的代码行b.只有在编译时拥有调试符号(-g)的程序才能在调试时看到源码c.同一行上有多个断点时,gdb仅中断在断点号最小的那个断点上d.断点可以设置在同一程序的不同文件中e.在任何给定时间,gdb只有一个焦点,即当前“活动”的文件f.源文件改变后,断点发生移动,带式断点属性的行号不变二、GDB基本命令清单查询在 gdb 提示符处键入help,将列出命令的分类,主要的分类有:* aliases:命令别名* breakpoints:断点定义;* data:数据查看;* files:指定并查看文件;* internals:维护命令;* running:程序执行;* stack:调用栈查看;* statu:状态查看;* tracepoints:跟踪程序执行。
键入 help 后跟命令的分类名(如help aliases),可获得该类命令的详细清单。
三、GDB基本命令用法1、运行退出run(简写r):执行程序(gdb)run app [argv1] [argv2] ...run命令后可跟随发给该程序的任何参数,包括标准输入和标准输出说明符(<和>)和外壳通配符(*、?、[、])在内。
如果使用不带参数的run命令,gdb就再次使用前一条run命令的参数。
set args:设定传递给程序的参数(gdb)set args [argv1] [argv2] ...show args:查看其缺省参数的列表(gdb)show argskill(简写k):异常终止在gdb 控制下运行的程序(gdb)killquit(简写q):退出gdb(gdb)quit2、查看信息list(简写l):查看源码(gdb) list line_num或l line_num,line_num为行号。
pirnt(简写p):print var:查看变量var的值。
(gdb) print var可以通过添加参数来设置输出格式:/x 按十六进制格式显示变量/d 按十进制格式显示变量/u 按十六进制格式显示无符号整型/o 按八进制格式显示变量/t 按二进制格式显示变量/a 按十六进制格式显示变量/c 按字符格式显示变量/f 按浮点数格式显示变量例如:print /x varprint可以显示被调试的语言中任何有效的表达式。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.本文介绍使用gdb调试程序的常用命令。
主要内容:[简介][举例][其他][简介]=============GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。
如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。
同时GDB也具有例如ddd这样的图形化的调试端。
一般来说,GDB主要完成下面四个方面的功能:(1)启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
(2)可让被调试的程序在你所指定的调置的断点处停住。
(断点可以是条件表达式)(3)当程序被停住时,可以检查此时你的程序中所发生的事。
(4)动态的改变你程序的执行环境。
[举例]=============*启动gdb$gdb这样可以和gdb进行交互了。
*启动gdb,并且分屏显示源代码:$gdb -tui这样,使用了'-tui'选项,启动可以直接将屏幕分成两个部分,上面显示源代码,比用list方便多了。
这时候使用上下方向键可以查看源代码,想要命令行使用上下键就用[Ctrl]n和[Ctrl]p.*启动gdb调试指定程序app:$gdb app这样就在启动gdb之后直接载入了app可执行程序,需要注意的是,载入的app程序必须在编译的时候有gdb调试选项,例如'gcc -g app app.c',注意,如果修改了程序的源代码,但是没有编译,那么在gdb中显示的会是改动后的源代码,但是运行的是改动前的程序,这样会导致跟踪错乱的。
*启动程序之后,再用gdb调试:$gdb <program> <PID>这里,<program>是程序的可执行文件名,<PID>是要调试程序的PID.如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。
gdb会自动attach上去,并调试他。
program应该在PATH环境变量中搜索得到。
*启动程序之后,再启动gdb调试:$gdb <PID>这里,程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID,<PID>是要调试程序的PID.这样gdb就附加到程序上了,但是现在还没法查看源代码,用file命令指明可执行文件就可以显示源代码了。
**启动gdb之后的交互命令:交互命令支持[Tab]补全。
*显示帮助信息:(gdb) help*载入指定的程序:(gdb) file app这样在gdb中载入想要调试的可执行程序app。
如果刚开始运行gdb而不是用gdb app启动的话可以这样载入app程序,当然编译app的时候要加入-g调试选项。
*重新运行调试的程序:(gdb) run要想运行准备调试的程序,可使用run命令,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出说明符(<和> )和shell通配符(*、?、[、])在内。
*修改发送给程序的参数:(gdb) set args no这里,假设我使用"r yes"设置程序启动参数为yes,那么这里的set args会设置参数argv[1]为no。
*显示缺省的参数列表:(gdb) show args*列出指定区域(n1到n2之间)的代码:(gdb) list n1 n2这样,list可以简写为l,将会显示n1行和n2行之间的代码,如果使用-tui启动gdb,将会在相应的位置显示。
如果没有n1和n2参数,那么就会默认显示当前行和之后的10行,再执行又下滚10行。
另外,list还可以接函数名。
一般来说在list后面可以跟以下这们的参数:<linenum> 行号。
<+offset> 当前行号的正偏移量。
<-offset> 当前行号的负偏移量。
<filename:linenum> 哪个文件的哪一行。
<function> 函数名。
<filename:function> 哪个文件中的哪个函数。
<*address> 程序运行时的语句在内存中的地址。
*执行下一步:(gdb) next这样,执行一行代码,如果是函数也会跳过函数。
这个命令可以简化为n.*执行N次下一步:(gdb) next N*执行上次执行的命令:(gdb) [Enter]这里,直接输入回车就会执行上次的命令了。
*单步进入:(gdb) step这样,也会执行一行代码,不过如果遇到函数的话就会进入函数的内部,再一行一行的执行。
*执行完当前函数返回到调用它的函数:(gdb) finish这里,运行程序,直到当前函数运行完毕返回再停止。
例如进入的单步执行如果已经进入了某函数,而想退出该函数返回到它的调用函数中,可使用命令finish.*指定程序直到退出当前循环体:(gdb) until或(gdb) u这里,发现需要把光标停止在循环的头部,然后输入u这样就自动执行全部的循环了。
*跳转执行程序到第5行:(gdb) jump 5这里,可以简写为"j 5"需要注意的是,跳转到第5行执行完毕之后,如果后面没有断点则继续执行,而并不是停在那里了。
另外,跳转不会改变当前的堆栈内容,所以跳到别的函数中就会有奇怪的现象,因此最好跳转在一个函数内部进行,跳转的参数也可以是程序代码行的地址,函数名等等类似list。
*强制返回当前函数:(gdb) return这样,将会忽略当前函数还没有执行完毕的语句,强制返回。
return后面可以接一个表达式,表达式的返回值就是函数的返回值。
*强制调用函数:(gdb) call <expr>这里,<expr>可以是一个函数,这样就会返回函数的返回值,如果函数的返回类型是void那么就不会打印函数的返回值,但是实践发现,函数运行过程中的打印语句还是没有被打印出来。
*强制调用函数2:(gdb) print <expr>这里,print和call的功能类似,不同的是,如果函数的返回值是void那么call不会打印返回值,但是print还是会打印出函数的返回值并且存放到历史记录中。
*在当前的文件中某一行(假设为6)设定断点:(gdb) break 6*设置条件断点:(gdb) break 46 if testsize==100这里,如果testsize==100就在46行处断点。
*检测表达式变化则停住:(gdb) watch i != 10这里,i != 10这个表达式一旦变化,则停住。
watch <expr> 为表达式(变量)expr设置一个观察点。
一量表达式值有变化时,马上停住程序(也是一种断点)。
*在当前的文件中为某一函数(假设为func)处设定断点:(gdb) break func*给指定文件(fileName)的某个行(N)处设置断点:(gdb) break fileName:N这里,给某文件中的函数设置断点是同理的。
*显示当前gdb断点信息:(gdb) info breakpoints这里,可以简写为info break.会显示当前所有的断点,断点号,断点位置等等。
*删除N号断点:(gdb) delete N*删除所有断点:(gdb) delete*清除行N上面的所有断点:(gdb) clear N*继续运行程序直接运行到下一个断点:(gdb) continue这里,如果没有断点就一直运行。
*显示当前调用函数堆栈中的函数:(gdb) backtrace命令产生一张列表,包含着从最近的过程开始的所有有效过程和调用这些过程的参数。
当然,这里也会显示出当前运行到了哪里(文件,行)。
*查看当前调试程序的语言环境:(gdb) show language这里,如果gdb不能识别你所调试的程序,那么默认是c语言。
*查看当前函数的程序语言:(gdb) info frame*显示当前的调试源文件:(gdb) info source这样会显示当前所在的源代码文件信息,例如文件名称,程序语言等。
*手动设置当前的程序语言为c++:(gdb) set language c++这里,如果gdb没有检测出你的程序语言,你可以这样设置。
*查看可以设置的程序语言:(gdb) set language这里,使用没有参数的set language可以查看gdb中可以设置的程序语言。
*终止一个正在调试的程序:(gdb) kill这里,输入kill就会终止正在调试的程序了。
*print显示变量(var)值:(gdb) print var这里,print可以简写为p,print 是gdb的一个功能很强的命令,利用它可以显示被调试的语言中任何有效的表达式。
表达式除了包含你程序中的变量外,还可以包含函数调用,复杂数据结构和历史等等。
*用16进制显示(var)值:(gdb) print /x var这里可以知道,print可以指定显示的格式,这里用'/x'表示16进制的格式。
可以支持的变量显示格式有:x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。
*如果a是一个数组,10个元素,如果要显示则:(gdb) print *a@10这样,会显示10个元素,无论a是double或者是int的都会正确地显示10个元素。
*修改运行时候的变量值:(gdb) print x=4这里,x=4是C/C++的语法,意为把变量x值改为4,如果你当前调试的语言是Pascal,那么你可以使用Pascal的语法:x:=4。
*显示一个变量var的类型:(gdb) whatis var*以更详细的方式显示变量var的类型:(gdb) ptype var这里,会打印出var的结构定义。
[其他]=============*在Qt4.x环境中打印QString msg;的msg变量:步骤如下:1)定义一个宏printqstringdefine printqstringprintf "(QString)0x%x (length=%i): \"",&$arg0,$arg0.d->sizeset $i=0while $i < $arg0.d->sizeset $c=$arg0.d->data[$i++]if $c < 32 || $c > 127printf "\\u0x%04x", $celseprintf "%c", (char)$cendendprintf "\"\n"end2)(gdb) printqstring msg这里,这个宏可以在gdb中直接定义,据说也可以写到$HOME/.gdbinit,这样每次启动自动加载。