GDB常用命令
Linux,GDB常用指令介绍 linux常用指令

(4)delete 断点编号:删除指定编号的断点。如果一次要删除多个断
解释:Num 列表示断点的编号,Type 指明类型,类型位 breakpoints 点,各个断点编号以空格隔开。
说明是中断。Disp 指示中断点在生效一次后Байду номын сангаас否就失去作用,如果是则
7.查看和设置变量的值
为 dis,不时则为 keep。
本文格式为 Word 版,下载可任意编辑,页眉双击删除即可。
Linux,GDB 常用指令介绍 linux 常用指令
你还在为不知道 Linux GDB 常用命令介绍而烦恼么?接下来是为 大家收集的 Linux GDB 常用命令介绍,希望能帮到大家。
Linux GDB 常用命令介绍 1.启动和退出 gdb (1)启动:gdb ***:显示一段版权说明; (*** 表示可执行程序名) (2)退出:quit。有的时候输入 quit 后会出现相关提示:类似于 “(y/n)”,输入 y 2.显示和查找程序源代码 (1)list :显示 10 行代码,但是我为什么没有显示成功呢? (2)list 5,10:显示源文件第五行到第十行的代码 (3)list t4.c:5,10:显示源文件中第五行到第十行的代码,在跳 是含有多个源文件的次序时使用; (4)list get_sum:显示 get_sum 函数周围的代码//什么叫周围的代 码呢? (5)list t4.c :get_sum:显示源文件 t4.c 中第五行到第十行的代
单步运行
next F10
区别:如果遇到函数,next 会把函数调用当作一条语句来执行,再
step F11
次输入 next 会执行函数调用后的语句;
开始调试运行
run F5
gdb monitor常用命令

gdb monitor常用命令导语:gdb是Linux下最常用的调试工具之一,而gdb monitor 是gdb的一个子命令集,提供了一些用于监控和控制程序执行的命令。
本文将介绍gdb monitor中常用的命令,帮助读者更好地使用gdb进行调试工作。
1. info registers这个命令用于显示当前程序中所有寄存器的值。
它可以帮助我们了解程序在不同执行阶段的寄存器状态,从而帮助我们找出程序运行时的问题。
例如,我们可以使用这个命令来查看某个寄存器的值是否符合预期,或者查看某个寄存器的值在某个条件下的变化情况。
2. x/命令x命令用于查看内存中的数据。
它的语法是x/[格式] [地址],其中格式可以是十六进制、十进制或者其他格式,地址可以是具体的地址或者是一个变量名。
这个命令可以帮助我们查看内存中的数据,从而帮助我们定位程序中的问题。
例如,我们可以使用x命令查看某个变量的值是否符合预期,或者查看某个内存地址中的数据是否被正确赋值。
3. break/命令break命令用于设置断点。
它的语法是break [文件名:行号],其中文件名是程序源代码的文件名,行号是要设置断点的行号。
这个命令可以帮助我们在程序的某个位置暂停执行,以便我们可以观察程序在此处的状态,从而帮助我们找出程序中的问题。
例如,我们可以使用break命令在程序的某个关键位置设置断点,然后运行程序,当程序执行到断点处时,gdb会自动暂停执行,我们就可以查看程序此时的状态了。
4. continuecontinue命令用于继续执行程序。
当程序被断点暂停时,我们可以使用continue命令让程序继续执行,直到下一个断点或者程序结束。
这个命令可以帮助我们逐步调试程序,从而找出程序中的问题。
例如,我们可以在程序的某个位置设置一个断点,然后使用continue命令让程序继续执行,直到程序再次暂停执行,我们就可以查看程序此时的状态了。
5. step/命令step命令用于单步执行程序。
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将设置“陷井”。
100个gdb小技巧

100个gdb小技巧(最新版4篇)目录(篇1)1.引言2.gdb基本用法3.gdb高级用法4.gdb在调试中的应用5.结论正文(篇1)gdb是一个强大的调试工具,对于程序员来说,熟练掌握gdb的使用技巧是非常重要的。
以下是100个gdb小技巧,帮助您更好地利用gdb进行调试。
1.在gdb启动时,可以指定要调试的可执行文件的路径。
例如,如果可执行文件名为“myprogram”,则可以使用以下命令启动gdb:gdb/path/to/myprogram2.在gdb中,可以使用“run”命令来运行程序,并使用“break”命令在指定的行上设置断点。
例如,如果要在第10行设置断点,则可以使用以下命令:break 103.在gdb中,可以使用“next”命令来逐行执行程序,使用“step”命令来进入函数调用,使用“continue”命令来继续运行程序。
例如,如果要从第10行开始逐行执行程序,则可以使用以下命令:next或step 104.在gdb中,可以使用“delete”命令来删除已经设置的断点。
例如,如果要删除第10行的断点,则可以使用以下命令:delete 105.在gdb中,可以使用“info”命令来查看当前的状态信息,例如变量值、调用栈等。
例如,如果要查看变量x的值,则可以使用以下命令:info variables x6.在gdb中,可以使用“print”命令来查看变量的值。
例如,如果要查看变量x的值,则可以使用以下命令:print x7.在gdb中,可以使用“display”命令来显示变量的值。
例如,如果要显示变量x的值并在程序运行时更新显示结果,则可以使用以下命令:display x8.在gdb中,可以使用“watch”命令来监视一个变量的值的变化。
例如,如果要监视变量x的变化并打印出每次的变化结果,则可以使用以下命令:watch x9.在gdb中,可以使用“set”命令来设置程序的运行环境。
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调试命令,包括查看变量,查看内存在你调试程序时,当程序被停住时,你可以使⽤print命令(简写命令为p),或是同义命令inspect来查看当前程序的运⾏数据。
print命令的格式是:printprint /是表达式,是你所调试的程序的语⾔的表达式(GDB可以调试多种编程语⾔),是输出的格式,⽐如,如果要把表达式按16进制的格式输出,那么就是/x。
⼀、表达式print和许多GDB的命令⼀样,可以接受⼀个表达式,GDB会根据当前的程序运⾏的数据来计算这个表达式,既然是表达式,那么就可以是当前程序运⾏中的const常量、变量、函数等内容。
可惜的是GDB不能使⽤你在程序中所定义的宏。
表达式的语法应该是当前所调试的语⾔的语法,由于C/C++是⼀种⼤众型的语⾔,所以,本⽂中的例⼦都是关于C/C++的。
(⽽关于⽤GDB 调试其它语⾔的章节,我将在后⾯介绍)在表达式中,有⼏种GDB所⽀持的操作符,它们可以⽤在任何⼀种语⾔中。
@是⼀个和数组有关的操作符,在后⾯会有更详细的说明。
::指定⼀个在⽂件或是⼀个函数中的变量。
{}表⽰⼀个指向内存地址的类型为type的⼀个对象。
⼆、程序变量在GDB中,你可以随时查看以下三种变量的值:1. 全局变量(所有⽂件可见的)2. 静态全局变量(当前⽂件可见的)3. 局部变量(当前Scope可见的)如果你的局部变量和全局变量发⽣冲突(也就是重名),⼀般情况下是局部变量会隐藏全局变量,也就是说,如果⼀个全局变量和⼀个函数中的局部变量同名时,如果当前停⽌点在函数中,⽤print显⽰出的变量的值会是函数中的局部变量的值。
如果此时你想查看全局变量的值时,你可以使⽤::操作符:file::variablefunction::variable可以通过这种形式指定你所想查看的变量,是哪个⽂件中的或是哪个函数中的。
例如,查看⽂件f2.c中的全局变量x的值:gdb) p 'f2.c'::x当然,::操作符会和C++中的发⽣冲突,GDB能⾃动识别::是否C++的操作符,所以你不必担⼼在调试C++程序时会出现异常。
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. 简介gdb是GNU Debugger的缩写,是一款功能强大的调试工具,可用于调试C、C++等程序。
本文将介绍如何安装和使用gdb。
2. 安装gdb以下是在Ubuntu系统上安装gdb的步骤:1.打开终端。
2.输入以下命令安装gdb:sudo apt-get install gdb3.输入系统密码确认安装。
4.等待安装完成。
3. 使用gdb进行调试以下是使用gdb进行调试的基本流程:1.编写带有调试信息的程序。
2.编译程序时需要添加-g选项,以保留调试信息。
例如:gcc -g -o program program.c3.在终端中输入以下命令启动gdb:gdb program这里的program是编译后生成的可执行文件。
4.使用gdb的命令进行调试。
下面是一些常用的gdb命令:•run:运行程序。
•break:设置断点。
•continue:继续执行程序直到下一个断点。
•next:单步执行程序。
•print:打印变量的值。
•finish:执行完当前函数并返回到调用该函数的地方。
•quit:退出gdb。
5.根据需要重复步骤4进行调试,直到找到和解决问题。
4. 调试示例下面以一个简单的C程序进行演示:```c #include <stdio.h>int factorial(int n) { if (n == 1) return 1; else return n * factorial(n-1); } int main() { int n = 5; printf(。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
附录A:GDB使用1.基本命令1)进入GDB #gdb testtest是要调试的程序,由gcctest.c -g -o test生成。
进入后提示符变为(gdb) 。
2)查看源码(gdb) l源码会进行行号提示。
如果需要查看在其他文件中定义的函数,在l后加上函数名即可定位到这个函数的定义及查看附近的其他源码。
或者:使用断点或单步运行,到某个函数处使用s进入这个函数。
3)设置断点(gdb) b 6这样会在运行到源码第6行时停止,可以查看变量的值、堆栈情况等;这个行号是gdb的行号。
4)查看断点处情况(gdb) info b可以键入"info b"来查看断点处情况,可以设置多个断点;5)运行代码(gdb) r6)显示变量值(gdb) p n在程序暂停时,键入"p 变量名"(print)即可;GDB在显示变量值时都会在对应值之前加上"$N"标记,它是当前变量值的引用标记,以后若想再次引用此变量,就可以直接写作"$N",而无需写冗长的变量名;7)观察变量(gdb) watch n在某一循环处,往往希望能够观察一个变量的变化情况,这时就可以键入命令"watch"来观察变量的变化情况,GDB在"n"设置了观察点;8)单步运行(gdb) n9)程序继续运行(gdb) c使程序继续往下运行,直到再次遇到断点或程序结束;10)退出GDB (gdb) q2.断点调试break+设置断点的行号,break n,在n行处设置断点;tbreak+行号或函数名,tbreak n/func,设置临时断点,到达后被自动删除;break+filename+行号, break main.c:10,用于在指定文件对应行设置断点;break + <0x...>,break 0x3400a,用于在内存某一位置处暂停;break + 行号 + if + 条件,break 10 if i==3,用于设置条件断点,在循环中使用非常方便;info breakpoints/watchpoints [n], info break,n表示断点号,查看断点/观察点的情况;clear+要清除的断点行号, clear 10,用于清除对应行的断点,要给出断点的行号,清除时GDB会给出提示;delete+要清除的断点编号,delete 3,用于清除断点和自动显示的表达式的命令,要给出断点的编号,清除时GDB不会给出任何提示;disable/enable+断点编号,disable 3,让所设断点暂时失效/使能,如果要让多个编号处的断点失效/使能,可将编号之间用空格隔开;awatch/watch+变量,awatch/watch i,设置一个观察点,当变量被读出或写入时程序被暂停;rwatch+变量,rwatchi,设置一个观察点,当变量被读出时,程序被暂停;catch,设置捕捉点来补捉程序运行时的一些事件。
如:载入共享库(动态链接库)或是C++的异常;tcatch,只设置一次捕捉点,当程序停住以后,应点被自动删除;3.数据命令display +表达式,display a,用于显示表达式的值,每当程序运行到断点处都会显示表达式的值;info display,用于显示当前所有要显示值的表达式的情况;delete+display 编号,delete 3,用于删除一个要显示值的表达式,被删除的表达式将不被显示;disable/enable+display 编号, disable/enable 3,使一个要显示值的表达式暂时失效/使能;undisplay+display 编号, undisplay 3,用于结束某个表达式值的显示;whatis+变量, whatisi,显示某个表达式的数据类型;print(p)+变量/表达式, p n,用于打印变量或表达式的值;set+变量 = 变量值,set i = 3,改变程序中某个变量的值;在使用print命令时,可以对变量按指定格式进行输出,其命令格式为print /变量名 + 格式。
其中常用的变量格式:x:十六进制;d:十进制;u:无符号数;o:八进制;c:字符格式;f:浮点数。
4.调试运行环境相关命令set args,set args arg1 arg2,设置运行参数;show args,show args,参看运行参数;set width+数目,set width 70,设置GDB的行宽;cd+工作目录,cd ../,切换工作目录;run,r/run,程序开始执行;step(s),s,进入式(会进入到所调用的子函数中)单步执行,进入函数的前提是,此函数被编译有debug信息;next(n),n,非进入式(不会进入到所调用的子函数中)单步执行;finish,finish,一直运行到函数返回并打印函数返回时的堆栈地址和返回值及参数值等信息until+行数,u 3,运行到函数某一行;continue(c),c,执行到下一个断点或程序结束;return <返回值>,return 5,改变程序流程,直接结束当前函数,并将指定值返回;call+函数,call func,在当前位置执行所要运行的函数;5.堆栈相关命令backtrace/bt bt 用来打印栈帧指针,也可以在该命令后加上要打印的栈帧指针的个数,查看程序执行到此时,是经过哪些函数呼叫的程序,程序“调用堆栈”是当前函数之前的所有已调用函数的列表(包括当前函数)。
每个函数及其变量都被分配了一个“帧”,最近调用的函数在 0 号帧中(“底部”帧)frame frame 1 用于打印指定栈帧info reg info reg 查看寄存器使用情况info stack info stack 查看堆栈使用情况up/down up/down 跳到上一层/下一层函数6.跳转执行jump 指定下一条语句的运行点。
可以是文件的行号,可以是file:line 格式,可以是+num这种偏移量格式。
表式着下一条运行语句从哪里开始。
相当于改变了PC寄存器内容,堆栈内容并没有改变,跨函数跳转容易发生错误。
7.信号命令signal signal SIGXXX 产生XXX信号,如SIGINT。
一种速查Linux 查询信号的方法:# kill -lhandle 在GDB中定义一个信号处理。
信号可以以SIG开头或不以SIG 开头,可以用定义一个要处理信号的范围(如:SIGIO-SIGKILL,表示处理从SIGIO 信号到SIGKILL的信号,其中包括SIGIO,SIGIOT,SIGKILL三个信号),也可以使用关键字all来标明要处理所有的信号。
一旦被调试的程序接收到信号,运行程序马上会被GDB停住,以供调试。
其可以是以下几种关键字的一个或多个:nostop/stop当被调试的程序收到信号时,GDB不会停住程序的运行,但会打出消息告诉你收到这种信号/GDB会停住你的程序print/noprint当被调试的程序收到信号时,GDB会显示出一条信息/GDB不会告诉你收到信号的信息passnoignore当被调试的程序收到信号时,GDB不处理信号。
这表示,GDB会把这个信号交给被调试程序会处理。
nopassignore当被调试的程序收到信号时,GDB不会让被调试程序来处理这个信号。
info signalsinfo handle可以查看哪些信号被GDB处理,并且可以看到缺省的处理方式single命令和shell的kill命令不同,系统的kill命令发信号给被调试程序时,是由GDB截获的,而single命令所发出一信号则是直接发给被调试程序的。
8.运行Shell命令如(gdb)shell ls来运行ls。
9.更多程序运行选项和调试1)程序运行参数。
set args 可指定运行时参数。
(如:set args 10 20 30 40 50)show args 命令可以查看设置好的运行参数。
2)运行环境。
path 可设定程序的运行路径。
show paths 查看程序的运行路径。
set environment varname [=value] 设置环境变量。
如:set env USER=hchen show environment [varname] 查看环境变量。
3)工作目录。
cd 相当于shell的cd命令。
pwd 显示当前的所在目录。
4)程序的输入输出。
info terminal 显示你程序用到的终端的模式。
使用重定向控制程序输出。
如:run >outfiletty命令可以指写输入输出的终端设备。
如:tty /dev/ttyb5)调试已运行的程序两种方法:(1)在UNIX下用ps查看正在运行的程序的PID(进程ID),然后用gdb PID 格式挂接正在运行的程序。
(2)先用gdb 关联上源代码,并进行gdb,在gdb中用attach命令来挂接进程的PID。
并用detach来取消挂接的进程。
6)暂停 / 恢复程序运行当进程被gdb停住时,你可以使用info program 来查看程序的是否在运行,进程号,被暂停的原因。
在gdb中,我们可以有以下几种暂停方式:断点(BreakPoint)、观察点(WatchPoint)、捕捉点(CatchPoint)、信号(Signals)、线程停止(Thread Stops),如果要恢复程序运行,可以使用c或是continue 命令。
7)线程(Thread Stops)如果程序是多线程,可以定义断点是否在所有的线程上,或是在某个特定的线程。
break threadbreak thread if ...linespec指定了断点设置在的源程序的行号。
threadno指定了线程的ID,注意,这个ID是GDB分配的,可以通过“info threads”命令来查看正在运行程序中的线程信息。
如果不指定thread 则表示断点设在所有线程上面。
还可以为某线程指定断点条件。
如:(gdb) break frik.c:13 thread 28 if bartab>lim当你的程序被GDB停住时,所有的运行线程都会被停住。
这方便查看运行程序的总体情况。
而在你恢复程序运行时,所有的线程也会被恢复运行。
10.调试core文件Core Dump:Core的意思是内存,Dump的意思是扔出来,堆出来。
开发和使用Unix程序时,有时程序莫名其妙的down了,却没有任何的提示(有时候会提示core dumped),这时候可以查看一下有没有形如core.进程号的文件生成,这个文件便是操作系统把程序down掉时的内存内容扔出来生成的, 它可以做为调试程序的参考(1)生成Core文件一般默认情况下,core file的大小被设置为了0,这样系统就不dump出core file了。