GDB命令大全

合集下载

gdb调试常用命令

gdb调试常用命令
1
8 9 10
删除所有断点 使断点无效 使断点有效
delete break
不需要参数
disable break <index> disable break 3:使序号为 3 的断点无效 enable break <index> enable break 3:使序号为 3 的断点有效 run:运行程序 run 12 34:带 12 和 34 两个参数运行程序 说明: run 12 34 等价于先执行 set args 12 34,然后执行 run print x:打印变量 x 的值 whatis x:打印变量 x 的类型 说明: ptype:比 whatis 的功能更强,他可以提供一个结构的定义 不需要参数 不需要参数 不需要参数 list <line1>显示程序第line1行的周围的源程序 list <line1,line2>显示第line1行到line2行之间的源代码 list <function> 显示函数名为function的函数的源程序 list 显示当前行4 15 16
打印变量值 打印变量类型 单步运行 (不进入) 单步运行(进入) 运行到断点
print <variable> whatis <variable> next step continue
17
显示源码
list
付春启 2011 年 2 月 23 日
2
gdb 调试常用命令
No. 1 功能 启动 gdb 程序 gdb 命令 用法举例(以调试程序 calc 为例) gdb:启动 gdb 调试程序 gdb ./calc:启动 gdb 调试程序,并载入 calc 文件中的符号列表 file ./calc:载入 calc 文件中的符号列表 2 载入文件符号表 打开或关闭源代码 窗口 设置程序运行参数 file <filename> 说明: gdb ./calc 等价于先执行 gdb,再执行 file ./calc 3 4 Ctrl+X+A set args 窗口切换快捷键 set args 12 34:设置程序运行参数为 12 和 34 两个参数 set args:取消先前所有参数设置 break 100:在第 100 行设置一个断点(单文件情况) break add:在 add 函数入口设置一个断点(单文件情况) 5 设置断点 break break main.cpp:100:在 main.cpp 文件的第 100 行设置一个断点(多文件 情况) break main.cpp:add :在 main.cpp 文件中的 add 函数入口设置一个断点( 多 文件情况) 6 7 查看断点信息 删除一个断点 info break delete break <index> 不需要参数 delete break 2:删除序号为 2 的断点

GDB命令

GDB命令

调试COREDUMP文件
• 当程序由于某种原因崩溃后会生成core dump文件,里面包 含程序崩溃时的堆栈信息和其他信息 • ulimit –c unlimited 要程序崩溃后自动生成core dump文件,需要执行ulimit -c 命令设置core dump文件的大小,一般会在用户配置文件添 加此命令,最后一个参数为设置core dump文件大小,这里 设为不限制大小 • 为了能掌握更多调试信息,我们要添加编译选项-g, 并把优 化选项等级设为最低(-O0, 默认为-O2)
GDB命令
• • • • • • • finish -跳出函数执行体,相当于VS的SHIFT+F11 -跳出循环体 u step -相当于VS的F11键 p [variant] -打印变量的值 info locals -显示当前所有局部变量的值 layout src -显示源代码窗口,调试时会有更新问题,可用CTRL+l更新 b [linenum/func] if [condition] -可以在某条件成立的时候,在某处下断 点 • watch [variant] -类似VS的监视变量,当触发断点时,会打印variant的值 • file [程序名] -当以gdb命令直接进入调试的时候,可以使用该命令加 载所要调试的程序
调试core dump示例
• gdb ./test core • where -显示引起程序崩溃的位置 • ba -打印堆栈信息
Байду номын сангаас
GDB常用命令
启动GDB的方式
• 直接输入gdb • gdb 程序名 • gdb 程序名 core文件
GDB启动示例
• gdb • gdb ./test • gdb ./test core

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调试命令,包括查看变量,查看内存经典的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命令大全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 汇编常见命令1.引言1.1 概述概述部分的内容可以简要介绍一下gdb和汇编语言的概念。

GDB是GNU Debugger的缩写,是一个功能强大的调试工具,用于帮助开发人员调试程序。

它可以与众多编程语言一起使用,包括汇编语言。

汇编语言是一种低级别的程序设计语言,用于直接操作计算机硬件。

本文将重点介绍gdb在汇编语言中的常见命令。

通过熟悉这些命令,开发人员可以更好地理解和调试汇编程序,提高程序的运行效率和稳定性。

文章后续部分将详细介绍常见的gdb命令和它们在汇编程序中的应用场景。

首先,我们将介绍常见命令1,在此命令中,我们将学习如何设置断点、单步执行程序、查看寄存器的值等。

然后,我们将进一步探讨常见命令2,该命令将介绍如何查看内存中的数据、修改内存值以及使用条件断点等。

通过本文,读者将能够掌握这些常见的gdb命令,并能够熟练运用它们进行汇编程序的调试。

最后,在结论部分,我们将对本文进行总结,并展望未来gdb在汇编语言调试中的应用前景。

接下来,我们将详细介绍2.1 常见命令1部分的内容。

1.2 文章结构文章结构部分的内容可以参考以下内容:文章结构部分介绍了整篇文章的组织结构和内容安排,旨在为读者提供一个清晰的框架和导引,使读者能够更好地理解和掌握文章内容。

在本文中,结构主要分为三个部分:引言、正文和结论。

引言部分首先对文章的主题进行了概述,简要介绍了gdb汇编调试工具的基本概念和作用。

接着,介绍了本文的结构,包括引言、正文和结论三个部分以及各个部分的内容安排。

最后,明确了本文的目的,旨在帮助读者掌握gdb汇编调试工具的常见命令。

正文部分是本文的核心内容,主要介绍了gdb汇编调试工具的常见命令。

这些命令包括但不限于断点设置、步进执行、变量查看、寄存器查看等。

每个命令都会详细解释其作用和用法,并通过实例进行演示,以便读者能够更好地理解和掌握。

结论部分对整篇文章进行总结,并展望了未来可能的研究方向和进一步探索的问题。

GDB 常用调试命令

GDB 常用调试命令

layout asm:显示反汇编窗口
layout regs:显示源代码/反汇编和CPU寄存器窗口
layout split:显示源代码和反汇编窗口
Ctrl + L:刷新窗口
quit:简记为 q ,退出gdb
当然,gdb的功能远不止这些,包括多进程/多线程/信号/远程调试等功能在这里均没有提及,有需要的读者可以参考其它信息。
GDB 常用调试命令
调用gdb编译需要在cc后面加 -g参数再加-o;
[root@redhat home]#gdb 调试文件:启动gdb
(gdb) l :(字母l)从第一行开始列出源码
(gdb) break n :在第n行处设置断点
(gdb) break func:在函数func()的入口处设置断点
(gdb) list
1 ../sysdeps/i386/elf/start.S: No such file or directory.
in ../sysdeps/i386/elf/பைடு நூலகம்tart.S
run:简记为 r ,其作用是运行程序,当遇到断点后,程序会在断点处停止运行,等待用户输入下一步的命令。
kill:将强行终止当前正在调试的程序
help 命令:help 命令将显示“命令”的常用帮助信息
call 函数(参数):调用“函数”,并传递“参数”,如:call gdb_test(55)
layout:用于分割窗口,可以一边查看代码,一边测试:
layout src:显示源代码窗口
(gdb) set args 参数:指定运行时的参数
(gdb) show args:查看设置好的参数
(gdb) show paths:查看程序运行路径;

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 列举断点
GDB 是 GNU 调试器(GNU Debugger)的缩写,是一个功能强大的开源调试器,用于调试 C、C++、Objective-C 和其他语言编写的程序。

当你提到"gdb 列举断点",我认为你是指使用GDB 的命令来查看和管理断点。

断点是 GDB 中用于暂停程序执行的位置。

以下是几个与断点相关的 GDB 命令:
breakpoints:列出所有当前的断点。

这会显示每个断点的编号、地址、
条件(如果有的话)以及其它相关信息。

2.delete breakpoint_number:删除一个特定的断点。

例如,delete 1会删
除编号为 1 的断点。

3.disable breakpoint_number:禁用一个特定的断点,这样程序在运行到
该断点时不会暂停。

4.enable breakpoint_number:启用一个已禁用的断点。

5.condition breakpoint_number expression:给断点设置一个条件。

只有
当该条件为真时,程序才会在到达该断点时暂停。

例如:
●如果你想在第 10 行代码上设置一个断点,你可以使用break 10命令。

●如果你想在某个特定的函数调用时暂停程序,你可以使用break
function_name命令。

●如果你想在变量x的值大于10 时暂停程序,你可以使用break
function_name if x > 10命令。

"gdb 列举断点" 就是指使用上述的GDB 命令来查看和管理断点,以便于程序的调试和分析。

gdb常用命令

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 常用命令
1)file命令:装入想要调试的可执行文件。
2)cd命令:改变工作目录。
3)pwd命令:返回当前工作日录。
4)run命令:执行当前被调试的程序。
5)kill命令:停止正在调试的应用程序。
6)list命令:列出正在调试的应用程序的源代码。
7)break命令:设置断点。
8)Tbreak命令;设置临时断点。它的语法与break相同。区别在于用tbreak设置的断点执行一次之后立即消失。
13)step命令:执行下一条源代码,进入函数内部。如果调用了某个函数,会跳到函数所在的代码中等候一步步执行。执行这个命令的前提是已经用run开始执行代码。
14)display命令:在应用程序每次停止运行时显示表达式的值。
15)info break命令:显示当前断点列表,包括每个断点到达的次数。
9)watch命令:设置监视点,监视表达式的变化。
10)awatch命令:设置读写监视点。当要监视的表达式被读或写时将应用程序挂起。它的语法与watch命令相同。
11)rwatch命令:设置读监视点,当监视表达式被读时将程序挂起,等侍调试。此命令的语法与watch相同。
12)next命令:执行下一条源代码,但是不进入函数内部。也就是说,将一条函数调用作为一条语句执行。执行这个命令的前提是已经run,开始了代码的执行。
22)Shell命令:执行Linux Shell命令。
23)make命令:不退出gdb而重新编译生成可执行文件。
24)it命令:退出gdb。
16)info files命令:显示调试文件的信息。
17)info func命令:显示所有的函数名。
18)info local命令:显示当前函数的所有局部变量的信息。

gdb 命令介绍

gdb 命令介绍
4.允许使用某个断点
(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基本命令从打开文件到调试结束的教程

GDB基本命令从打开文件到调试结束的教程

GDB基本命令从打开文件到调试结束的教程基于ARM核的芯片具有低功耗、高性能的特点,广泛应用于嵌入式Linux产品中,系统内核调试是建立系统软件平台的一个关键辅助技术。

接下来是小编为大家收集的GDB基本命令从打开文件到调试结束的教程,希望能帮到大家。

GDB基本命令从打开文件到调试结束的教程事前准备1 gcc -g -o 将原文件编译成可以让gdb调试的目标文件2 gdb 打开要调试的目标文件3 set args 设置参数或者run的时候用run 来实现4 show args 参看参数5 show environment 查看environment5 unset env 清除所有环境变量6 set environment 来设置一个环境变量VAR1设置/删除断点1 info sources 或list 来查看文件,要不然都不知道应该在哪里设置断点2 查看断点info breakpoints3 break4 tbreak 设置临时断点,到达后被自动删除5 enableenable deleteenable once6 disable7 delete breakpoints 删除断点或单用delete而不加任何参数来删除所有断点->断点进阶1 break test.c:5 设置断点到指定文件2 break 在内存某一个位置出暂停3 break if 来设置条件断点4 condition 对已存在的断点附上条件5 command 可以在第n个断点出设置命令开始调试0 run 程序开始执行1 step or s 单步执行2 next or n非进入式单步执行,就是说,当调用其他函数时,不进入那个函数内部3 finish 一直运行到函数返回4 until 运行到函数某一行5 continue or cont 执行到下一个断点或程序结束6 return 改变程序流程,直接结束当前函数,并将指定值返回设置变量set1 set i = 5 改变程序中一个变量的值2 set $i =5 来设置一个pdb环境里自己的变量,该变量独立于程序,也就是说只有gdb认识获取程序信息1 监视变量print /fmt 打印信息fmt格式,有以下几种------------------------------x 十六进制------------------------------d 十进制------------------------------u 无符号数------------------------------o 八进制------------------------------t 二进制------------------------------a 十六进制打印------------------------------c 字符格式------------------------------f 浮点数------------------------------2 追踪变量watch 追踪被赋值动作 eg. i = 4;rwatch 追踪读动作 eg. b = i;awatch 追踪所有动作del watchpoint .info displaydisplayshow displaydel display3 监视内存x /Address可以是内存地址或是指针,比如0x8799f000,p,&var fmt 由三部分组成NFU,N表示要查看的长度,U为格式,其中有分为bhwg,分别表示以字节,半字,字,双字来显示。

gdb调试命令

gdb调试命令

gdb调试命令 gdb是⼀个在UNIX环境下的命令⾏调试⼯具。

如果需要使⽤gdb调试程序,请在gcc时加上-g选项。

下⾯的命令部分是简化版,⽐如使⽤l代替list等等。

1.基本命令1)进⼊GDB #gdb test test是要调试的程序,由gcc test.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 + 变量 rwatch i 设置⼀个观察点,当变量被读出时,程序被暂停catch 设置捕捉点来补捉程序运⾏时的⼀些事件。

GDB命令行参数

GDB命令行参数

GDB 命令行参数
启动 GDB:
l gdb executable
l gdb -e executable -c core-file
l gdb executable -pid process-id
(利用命令 'ps -auxw' 能够查看进程的 pid)
GDB命令
GDB 中利用的命令:
GDB 操作提示
l 在编译可执行文件时需要给 gcc 加上 "-g" 选项,如此它才会为生成的可执行文件加入额外的调试信息。

l 不要利用编译器的优化选项,比如: "-O","-O2"。

因为编译器会为了优化而改变程序流程,那样无益于调试。

l 在 GDB 中执行 shell 命令能够利用:shell command
l GDB 命令能够利用 TAB 键来补全。

按两次 TAB 键能够看到所有可能的匹配。

l GDB 命令缩写:例如 info bre 中的 bre 相当于 breakpoints。

GDB 在 Emacs 中的操作:。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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. 进入除错程序并指定可执行文件。

2. 指定程序代码所在目录。

3. 设定断点后执行程序。

4. 程序于断点中断后,可以 (1)检视程序执行状态;检视变量值或变更变量值 (2) 逐步执行程序,或是全速执行程序到下一个断点或是到程序结束为止。

5. 离开除错程序。

以下将分为下列数项分别介绍:
1. 进入 GDB 及指定可执行档
2. 指定程序代码所在目录及检视程序代码
3. 断点的设定与清除
4. 全速及逐步执行程序
5. 检视及更改变量值
6. 检视程序执行状态
7. 读取 Core 文件信息
进入 GDB 及指定可执行档:
1. 进入 GDB 并读入可执行档 (档名为 'PROGRAM'),准备进行除错。

gdb PROGRAM
指定程序代码所在目录及检视程序代码
1. 增加目录 DIR 到收寻程序代码的目录列表 (如果你的程序代码和可执行档放在同一个目录下,就不须指定程序代码所在目录。

):
(gdb) directory DIR
2. 检视程序代码,格式计有:
(gdb) list => 显示目前执行程序代码前后各五行的程序代码;或是显示从上次 list 之后的程序代码
(gdb) list function => 显示该程序开始处前后五行的程序代码。

(gdb) list - =>上次显示程序代码的前面的十行。

断点的设定与清除
1. 设定断点(指令为 break,可简写为 (b),格式计有:
(gdb) break filename.c:30 => 在 filename.c 的第三十行处停止执行。

(gdb) break function => 在进入 function 时中断程序的执行。

(gdb) break filename.c:function => 在程序代码档 filename.c 中的函数 function 处设定断点。

(gdb) break => 在下一个将被执行的命令设定断点。

(gdb) break ... if cond => 只有当 cond 成立的时候才中断。

cond 须以 C 语言的语法写成。

2. 显示各个断点的信息。

(gdb) info break
3. 清除断点(命令为 clear),格式同 break 。

例如 :
(gdb) clear filename.c:30
4. 清除断点,NUM 是在 info break 显示出来的断点编号。

(gdb) delete NUM
全速及逐步执行程序
1. 从程序开头全速执行程序,直到遇到断点或是程序执行完毕为止。

(gdb) run
2. 在程序被中断后,全速执行程序到下一个断点或是程序结束为止 (continue 指令可简写为 c)。

(gdb) continue
3. 执行一行程序. 若呼叫函数, 则将该包含该函数程序代码视为一行程序 (next 指令可简写为 n)。

(gdb) next
4. 执行一行程序. 若呼叫函数, 则进入函数逐行执行 (step 指令可简写为 s)。

(gdb) step
5. 执行一行程序,若此时程序是在 for/while/do loop 循环的最后一行,则一直执行到循环结束后的第一行程序后停止 (until 指令可简写为 u)。

(gdb) until
6. 执行现行程序到回到上一层程序为止。

(gdb) finish
检视及更改变量值
1. print 叙述,显示该叙述执行的结果 (print 指令可简写为 p)。


(gdb) print a => 显示 a 变量的内容.
(gdb) print sizeof(a) => 显示 a 变量的长度.
2. display 叙述,在每个断点或是每执行一步时显示该叙述值。


(gdb) display a
3. 更改变量值:
(gdb) print (a=10) => 将变量 a 的值设定为 10.
检视程序执行状态
1. 查看程序执行到此时,是经过哪些函数呼叫的程序 (backtrace 指令可简写为bt),也就是查看函数呼叫堆栈。

(gdb) backtrace
读取 Core 文件信息
1. 读入 PROGRAM 及 PROGRAM.CORE 档,可检视 Core Dump 时程序变量值及程序流程状态。

gdb PROGRAM core
说明:'core' 档案是由 PROGRAM 档执行后,遇到 Core Dump 时产生的 Core 檔檔名。

如果你还需要该 Core 档,我们建议你将该档案档名更改为 PROGRAM.core。

在输入上述命令后,你可以用 GDB 提供的检视变量值以及检视程序执行状态来读取程序Core Dump 时的状态。

相关文档
最新文档