gdb大全
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 命令大全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是一个强大的命令行调试工具。
虽然X Window提供了GDB的图形版DDD,但是我仍然更钟爱在命令行模式下使用GDB。
大家知道命令行的强大就是在于,其可以形成执行序列,形成脚本。
UNIX下的软件全是命令行的,这给程序开发提代供了极大的便利,命令行软件的优势在于,它们可以非常容易的集成在一起,使用几个简单的已有工具的命令,就可以做出一个非常强大的功能。
于是UNIX下的软件比Windows下的软件更能有机地结合,各自发挥各自的长处,组合成更为强劲的功能。
而Windows下的图形软件基本上是各自为营,互相不能调用,很不利于各种软件的相互集成。
在这里并不是要和Windows做个什么比较,所谓“寸有所长,尺有所短”,图形化工具还是有不如命令行的地方。
1 GDB概述GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。
或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在 UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。
所谓“寸有所长,尺有所短”就是这个道理。
一般来说,GDB主要帮忙你完成下面四个方面的功能:1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。
(断点可以是条件表达式)3、当程序被停住时,可以检查此时你的程序中所发生的事。
4、动态的改变你程序的执行环境。
从上面看来,GDB和一般的调试工具没有什么两样,基本上也是完成这些功能,不过在细节上,你会发现GDB这个调试工具的强大,大家可能比较习惯了图形化的调试工具,但有时候,命令行的调试工具却有着图形化工具所不能完成的功能。
一个调试示例源程序:tst.c代码:1 #include23 int func(int n)4 {5 int sum=0,i;6 for(i=0; i7 {8 sum+=i;9 }10 return sum;11 }121314 main()16 int i;17 long result = 0;18 for(i=1; i<=100; i++)19 {20 result += i;21 }2223 printf("result[1-100] = %d", result );24 printf("result[1-250] = %d", func(250) );25 }编译生成执行文件:(Linux下)root@linux:/home/benben/test# gcc -g tst.c -o tst使用GDB调试:代码:root@linux:/home/benben/test# gdb tst <---------- 启动GDBGNU gdb 5.1.1Copyright 2002 Free Software Foundation, Inc.GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions.There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i386-suse-linux"...(gdb) l <-------------------- l命令相当于list,从第一行开始例出原码。
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可以显示被调试的语言中任何有效的表达式。
gdb常用命令
gdb常⽤命令基本信息查看栈信息不管是操作转储⽂件还是⽤GDB设置断点进⾏调试,都可以输⼊ (gdb)bt 打印栈内容进⾏查看。
⼀般的宕机BUG,看下宕机的位置,然后看下源代码基本就可以解决了。
但是很多情况下简单的 (gdb)bt 还查不到问题,这时候就要涉及到⽐较复杂的操作。
下⾯罗列了⼀些对栈的操作:(gdb) bt:显⽰所有栈帧(gdb) bt 10:显⽰前⾯10个栈帧(gdb) bt -10:显⽰后⾯10个栈帧(gdb) bt full:显⽰栈帧以及局部变量(gdb) bt full 10:显⽰前⾯10个栈帧以及局部变量(gdb) bt full -10:显⽰后⾯10个栈帧以及局部变量(gdb) frame <栈帧编号>:进⼊指定的栈帧中,然后可以查看当前栈帧中的局部变量,以及栈帧内容等信息(gdb) info frame <栈帧编号>:可以查看指定栈帧的详细信息(gdb) up:进⼊上层栈帧(gdb) down:进⼊下层栈帧变量调试BUG过程中查看变量信息是很有帮助的操作,查看⽅式如下:(gdb) p <变量名>寄存器对于调试来说寄存器中的值也很重要,可以查看到当前正在执⾏的指令的地址等。
具体操作罗列如下:(gdb) info reg:显⽰所有寄存器。
可以简写为:i r。
如果要查看具体的寄存器可以这样:i $ebx(gdb) p $eax:显⽰eax寄存器内容(gdb) p/c $eax:⽤字符显⽰eax寄存器内容,反斜杠后⾯的是显⽰格式,可使⽤的格式见下表:该表在显⽰内存内容的x命令中也是通⽤的格式说明x显⽰为⼗六进制数d显⽰为⼗进制数u显⽰位为符号⼗进制数o显⽰为⼋进制数t显⽰为⼆进制数a显⽰为地址c显⽰为字符(ASCII)f显⽰为浮点数s显⽰为字符串i显⽰为机器语⾔(仅在显⽰内存的x命令中可⽤)内存可以查看具体内存地址中的内容,⽐如:⽬前执⾏的汇编指令,以及栈中的内容等。
gdb 命令介绍
(gdb) enable breakpoint 1
该命令将允许断点 1,同时断点信息的 (Enb)域将变为 y
5.清除原文件中某一代码行上的所有断点
(gdb)clean number
注:number 为原文件的某个代码行的行号
六.变量的检查和赋值
l whatis:识别数组或变量的类型
* 设置断点;
* 监视程序变量的值;
* 程序的单步执行;
* 修改变量的值。
在可以使用 gdb 调试程序之前,必须使用 -g 选项编译源文件。可在 makefile 中如下定义 CFLAGS 变量:
CFLAGS = -g
运行 gdb 调试程序时通常使用如下的命令:
(gdb) break line-or-function if expr
例:
(gdb) break 46 if testsize==100
从断点继续运行:countinue 命令
五.断点的管理
1. 显示当前gdb的断点信息:
(gdb) info break
他会以如下的形式显示所有的断点信息:
bt 显示所有的调用栈帧。该命令可用来显示函数的调用顺序。
clear 删除设置在特定源文件、特定行上的断点。其用法为clear FILENAME:NUM
continue 继续执行正在调试的程序。该命令用在程序由于处理信号或断点而 导致停止运行时。
backtrace 显示程序中的当前位置和表示如何到达当前位置的栈跟踪(同义词:where)
breakpoint 在程序中设置一个断点
cd 改变当前工作目录
clear 删除刚才停止处的断点
gdb 命令表格
info thread
显示线程的信息
info variables
显示全局和静态变量的信息
next
执行下一行代码,如果遇到函数调用则进入函数内部
打印变量的值
run
启动程序执行
step
执行下一行代码,如果遇到函数调用则进入函数内部并进入下一行代码
until
执行代码直到遇到下一个断点或函数返回
whatis
显示变量的类型信息
where
显示当前位置的调用栈信息
这只是一些GDB命令的示例,GDB还提供了许多其他命令和功能,可以根据需要进行学习和使用。
下面是一些常见的GDB命令和其描述:
命令
描述
break设置断点源自bt回溯追踪,显示调用栈信息
continue
继续执行程序,直到遇到下一个断点或程序结束
display
显示变量的值,每次程序停止时都显示
info breakpoints
显示所有断点的信息
info registers
显示寄存器的值
info sharedlibrary
GDB详解大全
GDB用法详解于是UNIX下的软件比Windows下的软件更能有机地结合,各自发挥各自的长处,组合成更为强劲的功能。
而Windows下的图形软件基本上是各自为营,互相不能调用,很不利于各种软件的相互集成。
在这里并不是要和Windows做个什么比较,所谓“寸有所长,尺有所短”,图形化工具还是有不如命令行的地方。
1 GDB概述GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。
或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在 UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。
所谓“寸有所长,尺有所短”就是这个道理。
一般来说,GDB主要帮忙你完成下面四个方面的功能:1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。
(断点可以是条件表达式)3、当程序被停住时,可以检查此时你的程序中所发生的事。
4、动态的改变你程序的执行环境。
从上面看来,GDB和一般的调试工具没有什么两样,基本上也是完成这些功能,不过在细节上,你会发现GDB这个调试工具的强大,大家可能比较习惯了图形化的调试工具,但有时候,命令行的调试工具却有着图形化工具所不能完成的功能。
一个调试示例源程序:tst.c代码:1 #include23 int func(int n)4 {5 int sum=0,i;6 for(i=0; i7 {8 sum+=i;9 }10 return sum;11 }121314 main()15 {16 int i;17 long result = 0;18 for(i=1; i<=100; i++)19 {20 result += i;21 }2223 printf("result[1-100] = %d", result );24 printf("result[1-250] = %d", func(250) );25 }编译生成执行文件:(Linux下)root@linux:/home/benben/test# gcc -g tst.c -o tst使用GDB调试:代码:root@linux:/home/benben/test# gdb tst <---------- 启动GDBGNU gdb 5.1.1Copyright 2002 Free Software Foundation, Inc.GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions.There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i386-suse-linux"...(gdb) l <-------------------- l命令相当于list,从第一行开始例出原码。
GDB高级使用技巧
GDB高级使用技巧GDB(GNU调试器)是一款用于调试程序的强大工具,可以帮助开发人员在代码运行时跟踪和排查错误。
虽然它提供了一些基本的调试功能,如断点设置和变量查看,但它也提供了一些高级功能和技巧,可以帮助开发人员更高效地进行调试。
以下是一些GDB的高级使用技巧。
1. 多线程调试:GDB支持调试多线程程序。
可以使用"setscheduler-locking on"命令来将GDB锁定在一个特定的线程上,以便单步调试该线程。
可以使用"set scheduler-locking off"命令来解锁GDB,并让调度器选择下一个线程进行执行。
2. 远程调试:GDB支持与远程目标进行调试。
可以使用"target remote <IP>:<port>"命令连接到远程目标,并使用GDB对其进行调试。
这对于在嵌入式系统等设备中调试非常有用。
3. 自动生成调试脚本:GDB可以自动生成执行一系列调试命令的脚本。
可以使用"save breakpoints <filename>"命令将当前所有断点保存到一个文件中,然后可以使用"source <filename>"命令加载这个文件,从而自动设置断点。
4.条件断点:GDB支持在满足一定条件时才触发断点。
可以使用"break <line> if <condition>"命令设置一个条件断点,其中"line"是代码行号,"condition"是条件表达式。
当程序执行到该行时,只有当条件为真时才触发断点。
5.硬件断点:GDB支持使用硬件断点进行调试。
硬件断点可以设置在特定的内存地址上,而不是代码行上。
可以使用"break *0xaddress"命令在特定的地址上设置一个硬件断点。
gdb大全
gdb符号调试器――摘自《Linux上的C编程》1.gdb filename2.gdb命令祥解a)关于断点的命令ii.breakbreak 行号or:break 函数名iii.clear清除断点mands commands 断点号v.conditioncondition 断点编号(N) 条件表达式vi.deletevii.disabledisable 断点编号viii.enableenable 断点编号ix.innorex.tbreakb)关于数据的命令i.display显示一些表达式的值,使用了该命令之后,每当程序运行到断点处都会显示该表达式的值。
display用来显示当前所有的要显示值的表达式的有关情况。
iii.delete display用来删除一个要显示值的表达式。
iv.disable display使一个要显示值的表达式暂时无效,但并不删除该表达式的显示,可用于暂时屏蔽那些不需要显示的表达式,而在需要显示的时候可以在调用enable display命令。
v.enable displayvi.undisplayvii.whatis显示表达式的数据类型viii.print用来打印表达式的值,还可以用来打印内存中从某个变量开始的一段区域的内容,因此它的使用格式比较复杂。
在print命令后面的表达式中有两个符号是有特殊含义的,那就是$和$$。
$表示给定序号的前一个序号,$$表示给定序号向前第2序号。
例如,给定序号是5,那么$就表示序号4,print命令还可以用来对变量进行赋值,格式如下:(gdb)print 变量=表达式print 还可以打印出内存从某个部分开始的一块连续空间的内容:(gdb)print开始表达式@要打印的连续空间的大小其中的开始表达式必须是在内存中的一个表达式,这条命令是以数组的形式输出结果的,数组中的第零个元素就是开始表达式的值,第一个元素就是在内存中紧挨着开始表达式的空间中存放的值,依此类推。
gdb命令总结
今天学习使用gdb,现总结如下:关于断点的命令:awatch:awatch用来为一个表达式设置观察点,在表达式的值发生改变时,或者当表达式的值被读取的时候,程序停止执行。
awatch+表达式break:用于在程序中设置断点 break + 要设置断点的行号clear:用于清除断点 clear + 要清除断点的行号commands:用于为遇到断点之后执行特定的指令而设置的 command + 断点号如果commands 之后没有断点号,gdb会将最后一个设置的断点编号作为默认值。
condition:在满足一定的条件时才在指定的行上设置断点 condition 断点编号条件表达式delete:用于清除断点和自动显示的表达式的命令。
与clear的不同之处:clear要给出断点的行号,delete要给出断点的编号。
用clear命令清除断点时gdb会给出提示,而用delete清除断点时gdb不会给出任何提示disable:让所设断点暂时失效。
如果要让多个编号处的断点失效可将编号之间用空格隔开enable:与disable 相对ignore:这条命令在一定范围内忽略用户设定的断点 ignore N CONTtbreak:用于设置临时断点,所谓临时断点就是断点只在设置之后起作用一次。
watch:与awatch类似关于数据的命令:display:该命令用于显示表达式的值,使用了该命令后,每当程序运行到断点处都会显示表达式的值。
display 表达式如:display 5*jinfo display:用于显示当前所有要显示值的表达式的有关情况delete display:用于删除一个要显示值的表达式,调用这个命令删除一个表达式后,被删除的表达式将不被显示。
delete display 1disable display:使一个要显示的表达式暂时无效。
可有enable重新使之有效enable display:反操作disable diplayundisplay:用于结束某个表达式值的显示。
gdb 列举断点 -回复
gdb 列举断点-回复GDB(GNU调试器)是一个功能强大的开源调试工具,可用于调试C、C ++等编程语言。
其中,设置和管理断点是GDB中重要的功能之一。
断点是用于在程序执行期间中断程序的特殊指令。
通过在关键点上设置断点,开发人员可以检查程序状态,跟踪变量和执行路径,并诊断潜在问题。
在本文中,我们将介绍如何使用GDB设置和管理断点。
第一步:理解断点的类型在使用GDB设置断点之前,让我们首先了解常见的断点类型。
GDB支持多种类型的断点,包括以下几种:1. 行断点(Line breakpoints):在源代码的特定行设置断点,使程序在此处中断。
2. 函数断点(Function breakpoints):在特定函数的入口设置断点,使程序在调用该函数时中断。
3. 条件断点(Conditional breakpoints):设置一个表达式,只有在表达式为真时,程序才会在这个断点处中断。
4. 硬件断点(Hardware breakpoints):使用处理器支持的硬件断点机制设置断点。
硬件断点通常比软件断点更快,但数量有限,且某些调试器可能不支持。
5. 数据写入断点(Write watchpoints):在特定内存地址上设置断点,使程序在写入该地址时中断。
6. 数据读取断点(Read watchpoints):在特定内存地址上设置断点,使程序在读取该地址时中断。
第二步:编译程序并使用GDB启动调试会话要设置和管理断点,首先需要编译程序时启用调试信息。
使用C语言编译器(如gcc)时,可以添加-g选项,该选项会生成调试符号。
例如,在Linux上编译名为"program.c"的C程序时,可以使用以下命令:gcc -g program.c -o program接下来,使用GDB启动调试会话。
在命令行中输入"gdb program",其中"program"是编译生成的可执行文件。
gdb入门
gdb入门GDB常用命令查询gcc –g –o app main.c 在编译时给目标程序加入调试信息gdb ./app 进入GDB调试界面disassemble main 查看main函数的汇编p /x *0xbffff9b8 查看内存0xbffff9b8 的内容info registers 查看寄存器info break 查看断点列表info files 显示被调试文件的详细信息。
info func 显示所有的函数名称。
info local 显示当函数中的局部变量信息。
info prog 显示被调试程序的执行状态。
info var 显示所有的全局和静态变量名称。
b *0x804850d 设置断点,多用来设置汇编代码的调试delete breakpoint 1 该命令将会删除编号1的断点,如不带编号参数,将删除所有的断点p /x $eax 查看寄存器内容$符号,还有 $pc:程序计数器$fp :帧指针(当前堆栈帧)$sp :栈指针$ps :处理器状态next 不进入函数的单步执行step 进入函数的单步执行backtrace 显示程序中的当前位置和表示如何到达当前位置的栈跟踪(同义词:where)breakpoint 在程序中设置一个断点cd 改变当前工作目录clear 删除刚才停止处的断点commands 命中断点时,列出将要执行的命令continue 从断点开始继续执行delete 删除一个断点或监测点;也可与其他命令一起使用display 程序停止时显示变量和表达时down 下移栈帧,使得另一个函数成为当前函数frame 选择下一条continue命令的帧info 显示与该程序有关的各种信息jump 在源程序中的另一点开始运行kill 异常终止在gdb 控制下运行的程序list 列出相应于正在执行的程序的原文件内容print 显示变量或表达式的值pwd 显示当前工作目录ptype 显示一个数据类型的定义(如一个结构或C++类)quit 退出gdbreverse-search 在源文件中反向搜索正规表达式run 执行该程序search 在源文件中搜索正规表达式set variable 给变量赋值signal 将一个信号发送到正在运行的进程undisplay display命令的反命令,不要显示表达式until 结束当前循环up 上移栈帧,使另一函数成为当前函数watch 在程序中设置一个监测点(即数据断点)whatis 显示变量或函数类型GDB教程GDB是一个强大的命令行调试工具。
GDB常用指令
GDB常用指令——linux 操作系统实验在做操作系统实验时,需要运用GDB进行调试程序,现将一些常用的指令汇总如下。
点停止下来后,就执行命令,命令要以end结束,例如:显示rip之后的5条指令汇编指令,例如再用gdb分析C程序的函数调用时,需要了解C程序传输传递的一些约定规则。
参数传递,当被调用函数的参数小于或者等于6个时,参数传递只使用寄存器,不使用栈来传递参数,当被调用函数参数大于6个时,多于6个的参数将使用栈来传递。
其中第一至第六个参数对应的寄存器是%rdi,%rsi,%rdx,%rcx,%r8,%r9。
另外这6个寄存器的宽度会根据参数类型来改变,例如如果参数1是64 bits,就对应%rdi,如果是32 bits就对应%edi,16 bits 对应%di,8 bits 对应%dil。
此外%r8和%r9,是x64 CPU所特有的,以%r8为例,32bits 对应%r8d,16bits 对应%r8w,8bits 对应%r8b。
函数过程中寄存器修改规则,寄存器%rbx、%rbp、%r12、%r13、%r14、和%r15是被调用者保存寄存器,当过程P调用过程Q时,Q必须保持这些寄存器的值,也就是在Q开始运行到Q返回这个,过程中,这些值保持不变,换句话说,就是P调用完Q后,这些寄存器的值就是P 放在里面的值,在Q运行的过程中,如果要使用这些寄存器,就必须要先保存这些寄存器的原值,在Q返回之前,要将原值返回到寄存器中。
除去%rsp寄存器之外的所有其他寄存器是调用者保存寄存器,所有被调用者都可以修改这些寄存器的值,在之前,不用加以保护,也就是说,P在调用Q之前,由于Q可以随意的修改这些寄存器值,如果P需要在调用完Q后,需要继续寄存器中的当前值,那么P就需要在调用Q之前,将这些值加以保护——放入栈中。
在从Q返回后,再将这些值返回到寄存器中。
此外再用栈来传递参数时,参数从右向左逐个入栈的。
GDB详解——精选推荐
GDB详解1 简介GDB(GNU Debugger)是GCC的调试⼯具。
其功能强⼤,现描述如下:GDB主要帮忙你完成下⾯四个⽅⾯的功能:1.启动你的程序,可以按照你的⾃定义的要求随⼼所欲的运⾏程序。
2.可让被调试的程序在你所指定的调置的断点处停住。
(断点可以是条件表达式)3.当程序被停住时,可以检查此时你的程序中所发⽣的事。
4.动态的改变你程序的执⾏环境。
2 ⽣成调试信息⼀般来说GDB主要调试的是C/C++的程序。
要调试C/C++的程序,⾸先在编译时,我们必须要把调试信息加到可执⾏⽂件中。
使⽤编译器(cc/gcc/g++)的 -g 参数可以做到这⼀点。
如:gcc -g hello.c -o hellog++ -g hello.cpp -o hello如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运⾏时的内存地址。
当你⽤-g把调试信息加⼊之后,并成功编译⽬标代码以后,让我们来看看如何⽤gdb来调试他。
3 启动GDB 的⽅法1、gdb programprogram 也就是你的执⾏⽂件,⼀般在当前⽬录下。
2、gdb program core⽤gdb同时调试⼀个运⾏程序和core⽂件,core是程序⾮法执⾏后core dump后产⽣的⽂件。
3、gdb program 1234如果你的程序是⼀个服务程序,那么你可以指定这个服务程序运⾏时的进程ID。
gdb会⾃动attach上去,并调试他。
program应该在PATH环境变量中搜索得到。
4 程序运⾏上下⽂4.1 程序运⾏参数set args 可指定运⾏时参数。
(如:set args 10 20 30 40 50 )show args 命令可以查看设置好的运⾏参数。
run (r) 启动程序不指定运⾏参数 r指定运⾏参数r 10 20 30 40 504.2 ⼯作⽬录cd 相当于shell的cd命令。
pwd 显⽰当前的所在⽬录。
4.3 程序的输⼊输出info terminal 显⽰你程序⽤到的终端的模式。
7.gdb介绍和实践
返回
7.9 常用的gdb命令
backtrace 显示程序中的当前位置和表示如何到达当前位置的栈跟踪(同义词: where) breakpoint 在程序中设置一个断点 cd 改变当前工作目录 clear 删除刚才停止处的断点 commands 命中断点时,列出将要执行的命令 continue 从断点开始继续执行 delete 删除一个断点或监测点;也可与其他命令一起使用 display 程序停止时显示变量和表达时 down 下移栈帧,使得另一个函数成为当前函数 frame 选择下一条continue命令的帧 info 显示与该程序有关的各种信息 jump 在源程序中的另一点开始运行 kill 异常终止在gdb 控制下运行的程序 list 列出相应于正在执行的程序的原文件内容 next 执行下一个源程序行,从而执行其整体中的一个函数 返回
返回
7.11 举例说明
代码(sample.c) #include <stdio.h> void PrintLn(const char* pMsg) { printf(“%s\n”, pMsg); } int main(int argc, char* argv[]) { PrintLn(“Hello GDB”); return 0; }
返回
7.6 断点的管理
1.显示当前gdb的断点信息: (gdb) info break 2.删除指定的某个断点: (gdb) delete breakpoint 1 该命令将会删除编号为1的断点,如果不带编号参数,将删除所有的断点 (gdb) delete breakpoint 3.禁止使用某个断点 (gdb) disable breakpoint 1 该命令将禁止断点 1,同时断点信息的 (Enb)域将变为 n 4.允许使用某个断点 (gdb) enable breakpoint 1 该命令将允许断点 1,同时断点信息的 (Enb)域将变为 y 5.清除原文件中某一代码行上的所有断点 (gdb)clean number
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。
或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。
所谓“寸有所长,尺有所短”就是这个道理。
用GDB调试程序GDB概述————GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。
或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。
所谓“寸有所长,尺有所短”就是这个道理。
一般来说,GDB主要帮忙你完成下面四个方面的功能:1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。
(断点可以是条件表达式)3、当程序被停住时,可以检查此时你的程序中所发生的事。
4、动态的改变你程序的执行环境。
从上面看来,GDB和一般的调试工具没有什么两样,基本上也是完成这些功能,不过在细节上,你会发现GDB这个调试工具的强大,大家可能比较习惯了图形化的调试工具,但有时候,命令行的调试工具却有着图形化工具所不能完成的功能。
让我们一一看来。
一个调试示例——————源程序:tst.c1 #include <stdio.h>23 int func(int n)4 {5 int sum=0,i;6 for(i=0; i<n; i++)7 {8 sum+=i;9 }10 return sum;11 }121314 main()15 {16 int i;17 long result = 0;18 for(i=1; i<=100; i++)19 {20 result += i;21 }2223 printf("result[1-100] = %d n", result );24 printf("result[1-250] = %d n", func(250) );25 }编译生成执行文件:(Linux下)hchen/test> cc -g tst.c -o tst使用GDB调试:hchen/test> gdb tst <---------- 启动GDBGNU gdb 5.1.1Copyright 2002 Free Software Foundation, Inc.GDB is free software, covered by the GNU General Public License, and you arewelcome to change it and/or distribute copies of it under certain conditions.Type "show copying" to see the conditions.There is absolutely no warranty for GDB. Type "show warranty" for details.This GDB was configured as "i386-suse-linux"...(gdb) l <-------------------- l命令相当于list,从第一行开始例出原码。
1 #include <stdio.h>23 int func(int n)4 {5 int sum=0,i;6 for(i=0; i<n; i++)7 {8 sum+=i;9 }10 return sum;(gdb) <-------------------- 直接回车表示,重复上一次命令11 }121314 main()15 {16 int i;17 long result = 0;18 for(i=1; i<=100; i++)19 {20 result += i;(gdb) break 16 <-------------------- 设置断点,在源程序第16行处。
Breakpoint 1 at 0x8048496: file tst.c, line 16.(gdb) break func <-------------------- 设置断点,在函数func()入口处。
Breakpoint 2 at 0x8048456: file tst.c, line 5.(gdb) info break <-------------------- 查看断点信息。
Num Type Disp Enb Address What1 breakpoint keep y 0x08048496 in main at tst.c:162 breakpoint keep y 0x08048456 in func at tst.c:5(gdb) r <--------------------- 运行程序,run命令简写Starting program: /home/hchen/test/tstBreakpoint 1, main () at tst.c:17 <---------- 在断点处停住。
17 long result = 0;(gdb) n <--------------------- 单条语句执行,next命令简写。
18 for(i=1; i<=100; i++)(gdb) n20 result += i;(gdb) n18 for(i=1; i<=100; i++)(gdb) n20 result += i;(gdb) c <--------------------- 继续运行程序,continue命令简写。
Continuing.result[1-100] = 5050 <----------程序输出。
Breakpoint 2, func (n=250) at tst.c:55 int sum=0,i;(gdb) n6 for(i=1; i<=n; i++)(gdb) p i <--------------------- 打印变量i的值,print命令简写。
$1 = 134513808(gdb) n8 sum+=i;(gdb) n6 for(i=1; i<=n; i++)(gdb) p sum$2 = 1(gdb) n8 sum+=i;(gdb) p i$3 = 2(gdb) n6 for(i=1; i<=n; i++)(gdb) p sum$4 = 3(gdb) bt <--------------------- 查看函数堆栈。
#0 func (n=250) at tst.c:5#1 0x080484e4 in main () at tst.c:24#2 0x400409ed in __libc_start_main () from /lib/libc.so.6(gdb) finish <--------------------- 退出函数。
Run till exit from #0 func (n=250) at tst.c:50x080484e4 in main () at tst.c:2424 printf("result[1-250] = %d n", func(250) );Value returned is $6 = 31375(gdb) c <--------------------- 继续运行。
Continuing.result[1-250] = 31375 <----------程序输出。
Program exited with code 027. <--------程序退出,调试结束。
(gdb) q <--------------------- 退出gdb。
hchen/test>好了,有了以上的感性认识,还是让我们来系统地认识一下gdb吧。
使用GDB————一般来说GDB主要调试的是C/C++的程序。
要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。
使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点。
如:> cc -g hello.c -o hello> g++ -g hello.cpp -o hello如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。
当你用-g把调试信息加入之后,并成功编译目标代码以后,让我们来看看如何用gdb来调试他。
启动GDB的方法有以下几种:1、gdb <program>program也就是你的执行文件,一般在当然目录下。
2、gdb <program> core用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。
3、gdb <program> <PID>如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。
gdb会自动attach上去,并调试他。
program应该在PATH环境变量中搜索得到。
GDB启动时,可以加上一些GDB的启动开关,详细的开关可以用gdb -help查看。
我在下面只例举一些比较常用的参数:-symbols <file>-s <file>从指定文件中读取符号表。
-se file从指定文件中读取符号表信息,并把他用在可执行文件中。
-core <file>-c <file>调试时core dump的core文件。
-directory <directory>-d <directory>加入一个源文件的搜索路径。
默认搜索路径是环境变量中PATH所定义的路径。
GDB的命令概貌———————启动gdb后,就你被带入gdb的调试环境中,就可以使用gdb的命令开始调试程序了,gdb的命令可以使用help命令来查看,如下所示:/home/hchen> gdbGNU gdb 5.1.1Copyright 2002 Free Software Foundation, Inc.GDB is free software, covered by the GNU General Public License, and you arewelcome to change it and/or distribute copies of it under certain conditions.Type "show copying" to see the conditions.There is absolutely no warranty for GDB. Type "show warranty" for details.This GDB was configured as "i386-suse-linux".(gdb) helpList of classes of commands:aliases -- Aliases of other commandsbreakpoints -- Making program stop at certain pointsdata -- Examining datafiles -- Specifying and examining filesinternals -- Maintenance commandsobscure -- Obscure featuresrunning -- Running the programstack -- Examining the stackstatus -- Status inquiriessupport -- Support facilitiestracepoints -- Tracing of program execution without stopping the programuser-defined -- User-defined commandsType "help" followed by a class name for a list of commands in that class.Type "help" followed by command name for full documentation.Command name abbreviations are allowed if unambiguous.(gdb)gdb的命令很多,gdb把之分成许多个种类。