1. gdb基本命令
  2.  
  3. 本文介绍使用gdb调试程序的常用命令。
  4. 主要内容:
  5. [简介]
  6. [举例]
  7. [其他]
  8.  
  9. [简介]
  10. =============
  11. GDBGNU开源组织发布的一个强大的UNIX下的程序调试工具。如果你是在 UNIX平台下做软件,你会发现GDB这个调试工具有比VCBCB的图形化调试器更强大的功能。同时GDB也具有例如ddd这样的图形化的调试端。
  12. 一般来说,GDB主要完成下面四个方面的功能:
  13. ()启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
  14. ()可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
  15. ()当程序被停住时,可以检查此时你的程序中所发生的事。
  16. ()动态的改变你程序的执行环境。
  17.  
  18. 兴趣是最好的老师,这里先整理总结一下在调试的过程中经常遇到的问题。带着这些问题进行学习和实践可以有助于加深印象。 再往后是本人实践过程中总结的常见命令,如有什么问题或者建议,都可以联系我,谢谢!^_^
  19. ()如何打印变量的值?(print var)
  20. ()如何打印变量的地址?(print &var)
  21. ()如何打印地址的数据值?(print *address)
  22. ()如何查看当前运行的文件和行?(backtrace)
  23. ()如何查看指定文件的代码?(list file:N)
  24. ()如何立即执行完当前的函数,但是并不是执行完整个应用程序?(finish)
  25. ()如果程序是多文件的,怎样定位到指定文件的指定行或者函数?(list file:N)
  26. ()如果循环次数很多,如何执行完当前的循环?(until)
  27. ()多线程如何调试?(???)
  28.  
  29. 作者:QuietHeart
  30. Email: quiet_heart000@.com
  31.  
  32. [举例]
  33. =============
  34. *启动gdb
  35. $gdb
  36. 这样可以和gdb进行交互了。
  37.  
  38. *启动gdb,并且分屏显示源代码:
  39. $gdb -tui
  40. 这样,使用了'-tui'选项,启动可以直接将屏幕分成两个部分,上面显示源代码,比用list方便多了。这时候使用上下方向键可以查看源代码,想要命令行使用上下键就用[Ctrl]n和[Ctrl]p.
  41.  
  42. *启动gdb调试指定程序app
  43. $gdb app
  44. 这样就在启动gdb之后直接载入了app可执行程序,需要注意的是,载入的app程序必须在编译的时候有gdb调试选项,例如'gcc -g app app.c',注意,如果修改了程序的源代码,但是没有编译,那么在gdb中显示的会是改动后的源代码,但是运行的是改动前的程序,这样会导致跟踪错乱的。
  45.  
  46. *启动程序之后,再用gdb调试:
  47. $gdb <program> <PID>
  48. 这里,<program>是程序的可执行文件名,<PID>是要调试程序的PID.如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程IDgdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。
  49.  
  50. *启动程序之后,再启动gdb调试:
  51. $gdb <PID>
  52. 这里,程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID,<PID>是要调试程序的PID.这样gdb就附加到程序上了,但是现在还没法查看源代码,用file命令指明可执行文件就可以显示源代码了。
  53.  
  54. **启动gdb之后的交互命令:
  55. 交互命令支持[Tab]补全。
  56.  
  57. *显示帮助信息:
  58. (gdb) help
  59.  
  60. *载入指定的程序:
  61. (gdb) file app
  62. 这样在gdb中载入想要调试的可执行程序app。如果刚开始运行gdb而不是用gdb app启动的话可以这样载入app程序,当然编译app的时候要加入-g调试选项。
  63.  
  64. *重新运行调试的程序:
  65. (gdb) run
  66. 要想运行准备调试的程序,可使用run命令,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出说明符(<和> )和shell通配符(*、?、[、])在内。
  67.  
  68. *修改发送给程序的参数:
  69. (gdb) set args no
  70. 这里,假设我使用"r yes"设置程序启动参数为yes,那么这里的set args会设置参数argv[]为no
  71.  
  72. *显示缺省的参数列表:
  73. (gdb) show args
  74.  
  75. *列出指定区域(n1n2之间)的代码:
  76. (gdb) list n1 n2
  77. 这样,list可以简写为l,将会显示n1行和n2行之间的代码,如果使用-tui启动gdb,将会在相应的位置显示。如果没有n1n2参数,那么就会默认显示当前行和之后的10行,再执行又下滚10行。另外,list还可以接函数名。
  78. 一般来说在list后面可以跟以下这们的参数:
  79. <linenum> 行号。
  80. <+offset> 当前行号的正偏移量。
  81. <-offset> 当前行号的负偏移量。
  82. <filename:linenum> 哪个文件的哪一行。
  83. <function> 函数名。
  84. <filename:function> 哪个文件中的哪个函数。
  85. <*address> 程序运行时的语句在内存中的地址。
  86.  
  87. *执行下一步:
  88. (gdb) next
  89. 这样,执行一行代码,如果是函数也会跳过函数。这个命令可以简化为n.
  90.  
  91. *执行N次下一步:
  92. (gdb) next N
  93.  
  94. *执行上次执行的命令:
  95. (gdb) [Enter]
  96. 这里,直接输入回车就会执行上次的命令了。
  97.  
  98. *单步进入:
  99. (gdb) step
  100. 这样,也会执行一行代码,不过如果遇到函数的话就会进入函数的内部,再一行一行的执行。
  101.  
  102. *执行完当前函数返回到调用它的函数:
  103. (gdb) finish
  104. 这里,运行程序,直到当前函数运行完毕返回再停止。例如进入的单步执行如果已经进入了某函数,而想退出该函数返回到它的调用函数中,可使用命令finish.
  105.  
  106. *指定程序直到退出当前循环体:
  107. (gdb) until
  108. 或(gdb) u
  109. 这里,发现需要把光标停止在循环的头部,然后输入u这样就自动执行全部的循环了。
  110.  
  111. *跳转执行程序到第5行:
  112. (gdb) jump
  113. 这里,可以简写为"j 5"需要注意的是,跳转到第5行执行完毕之后,如果后面没有断点则继续执行,而并不是停在那里了。
  114. 另外,跳转不会改变当前的堆栈内容,所以跳到别的函数中就会有奇怪的现象,因此最好跳转在一个函数内部进行,跳转的参数也可以是程序代码行的地址,函数名等等类似list
  115.  
  116. *强制返回当前函数:
  117. (gdb) return
  118. 这样,将会忽略当前函数还没有执行完毕的语句,强制返回。return后面可以接一个表达式,表达式的返回值就是函数的返回值。
  119.  
  120. *强制调用函数:
  121. (gdb) call <expr>
  122. 这里,<expr>可以是一个函数,这样就会返回函数的返回值,如果函数的返回类型是void那么就不会打印函数的返回值,但是实践发现,函数运行过程中的打印语句还是没有被打印出来。
  123.  
  124. *强制调用函数2
  125. (gdb) print <expr>
  126. 这里,printcall的功能类似,不同的是,如果函数的返回值是void那么call不会打印返回值,但是print还是会打印出函数的返回值并且存放到历史记录中。
  127.  
  128. *在当前的文件中某一行(假设为6)设定断点:
  129. (gdb) break
  130.  
  131. *设置条件断点:
  132. (gdb) break if testsize==
  133. 这里,如果testsize==100就在46行处断点。
  134.  
  135. *检测表达式变化则停住:
  136. (gdb) watch i !=
  137. 这里,i != 10这个表达式一旦变化,则停住。watch <expr> 为表达式(变量)expr设置一个观察点。一量表达式值有变化时,马上停住程序(也是一种断点)。
  138.  
  139. *在当前的文件中为某一函数(假设为func)处设定断点:
  140. (gdb) break func
  141.  
  142. *给指定文件(fileName)的某个行(N)处设置断点:
  143. (gdb) break fileName:N
  144. 这里,给某文件中的函数设置断点是同理的。
  145.  
  146. *显示当前gdb断点信息:
  147. (gdb) info breakpoints
  148. 这里,可以简写为info break.会显示当前所有的断点,断点号,断点位置等等。
  149.  
  150. *删除N号断点:
  151. (gdb) delete N
  152.  
  153. *删除所有断点:
  154. (gdb) delete
  155.  
  156. *清除行N上面的所有断点:
  157. (gdb) clear N
  158.  
  159. *继续运行程序直接运行到下一个断点:
  160. (gdb) continue
  161. 这里,如果没有断点就一直运行。
  162.  
  163. *显示当前调用函数堆栈中的函数:
  164. (gdb) backtrace
  165. 命令产生一张列表,包含着从最近的过程开始的所有有效过程和调用这些过程的参数。当然,这里也会显示出当前运行到了哪里(文件,行)。
  166.  
  167. *查看当前调试程序的语言环境:
  168. (gdb) show language
  169. 这里,如果gdb不能识别你所调试的程序,那么默认是c语言。
  170.  
  171. *查看当前函数的程序语言:
  172. (gdb) info frame
  173.  
  174. *显示当前的调试源文件:
  175. (gdb) info source
  176. 这样会显示当前所在的源代码文件信息,例如文件名称,程序语言等。
  177.  
  178. *手动设置当前的程序语言为c++:
  179. (gdb) set language c++
  180. 这里,如果gdb没有检测出你的程序语言,你可以这样设置。
  181.  
  182. *查看可以设置的程序语言:
  183. (gdb) set language
  184. 这里,使用没有参数的set language可以查看gdb中可以设置的程序语言。
  185.  
  186. *终止一个正在调试的程序:
  187. (gdb) kill
  188. 这里,输入kill就会终止正在调试的程序了。
  189.  
  190. *print显示变量(var)值:
  191. (gdb) print var
  192. 这里,print可以简写为p,print gdb的一个功能很强的命令,利用它可以显示被调试的语言中任何有效的表达式。表达式除了包含你程序中的变量外,还可以包含函数调用,复杂数据结构和历史等等。
  193.  
  194. *用16进制显示(var)值:
  195. (gdb) print /x var
  196. 这里可以知道,print可以指定显示的格式,这里用'/x'表示16进制的格式。
  197. 可以支持的变量显示格式有:
  198. x 按十六进制格式显示变量。
  199. d 按十进制格式显示变量。
  200. u 按十六进制格式显示无符号整型。
  201. o 按八进制格式显示变量。
  202. t 按二进制格式显示变量。
  203. a 按十六进制格式显示变量。
  204. c 按字符格式显示变量。
  205. f 按浮点数格式显示变量。
  206.  
  207. *如果a是一个数组,10个元素,如果要显示则:
  208. (gdb) print *a@
  209. 这样,会显示10个元素,无论adouble或者是int的都会正确地显示10个元素。
  210.  
  211. *修改运行时候的变量值:
  212. (gdb) print x=
  213. 这里,x=4C/C++的语法,意为把变量x值改为4,如果你当前调试的语言是Pascal,那么你可以使用Pascal的语法:x:=。
  214.  
  215. *显示一个变量var的类型:
  216. (gdb) whatis var
  217.  
  218. *以更详细的方式显示变量var的类型:
  219. (gdb) ptype var
  220. 这里,会打印出var的结构定义。
  221.  
  222. [其他]
  223. =============
  224. *在Qt4.x环境中打印QString msg;的msg变量:
  225. 步骤如下:
  226. )定义一个宏printqstring
  227. define printqstring
  228. printf "(QString)0x%x (length=%i): \"",&$arg0,$arg0.d->size
  229. set $i=
  230. while $i < $arg0.d->size
  231. set $c=$arg0.d->data[$i++]
  232. if $c < || $c >
  233. printf "\\u0x%04x", $c
  234. else
  235. printf "%c", (char)$c
  236. end
  237. end
  238. printf "\"\n"
  239. end
  240. )(gdb) printqstring msg
  241. 这里,这个宏可以在gdb中直接定义,据说也可以写到$HOME/.gdbinit,这样每次启动自动加载。
  242.  
  243. *调试同时指明生成core文件:
  244. $gdb <program> core
  245. gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。当程序非法崩溃的时候会产生一个core文件,然后使用这个命令,会直接定位到发生程序崩溃的位置。注意:有时需要设置系统命令“ulimit -c unlimited”才能产生core文件。
  246.  
  247. **没有实践过的
  248. *print显示存储块,如显示h后面的10个整数:
  249. print h@
  250. **
    http://blog.csdn.net/yinjiabin/article/details/7732931

gdb基本命令(非常详细)的更多相关文章

  1. GDB基本命令(整合)(转)

    directory:添加源文件目录 l src.cpp:line_num可进入文件 如:l src.cpp:10 回车自动重复上一命令 一.gdb调试基本知识a.调试器指示的是将要执行的代码行b.只有 ...

  2. 【转载】gdb基本命令总结

    本文介绍使用gdb调试程序的常用命令. 主要内容: [简介] [举例] [其他] [简介]  ============= GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.如果你是在 U ...

  3. gdb基本命令总结

    本文介绍使用gdb调试程序的常用命令.  主要内容: [简介] [举例] [其他] [简介]  ============= GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.如果你是在 ...

  4. gdb 基本命令

    backtrace(或bt) 查看各级函数调用及参数 finish 连续运行到当前函数返回为止,然后停下来等待命令 frame(或f) 帧编号 选择栈帧 info(或i) locals 查看当前栈帧局 ...

  5. mongodb 3.0下载安装、配置及mongodb最新特性、基本命令教程详细介绍

    mongoDB简介(本文由www.169it.com搜集整理) MongoDB是一个高性能,开源,无模式的文档型数据库,是目前在IT行业非常流行的一种非关系型数据库(NoSql).它在许多场景下可用于 ...

  6. 哈工大CSAPP大作业

    第1章 概述 1.1 Hello简介 hello的源码hello.c文件,要生成可执行文件,首先要进行预处理,其次要进行编译生成汇编代码,接着进行汇编处理生成目标文件,目标文件通过链接器形成一个可执行 ...

  7. GDB 命令详细解释

    Linux中包含有一个很有用的调试工具--gdb(GNU Debuger),它可以用来调试C和C++程序,功能不亚于Windows下的许多图形界面的调试工具. 和所有常用的调试工具一样,gdb提供了以 ...

  8. windows下配置 GNU的gdb调试功能

    1.配置 修改环境变量(前提电脑中存在gdb.exe) 1. 我的电脑->属性->环境......在path那一项后面添加你DEV-C++ Bin目录的路径(gdb.exe所在目录),如: ...

  9. 用 gdb 调试 GCC 程序

    Linux 包含了一个叫 gdb 的 GNU 调试程序. gdb 是一个用来调试 C 和 C++ 程序的强力调试器. 它使你能在程序运行时观察程序的内部结构和内存的使用情况. 以下是 gdb 所提供的 ...

随机推荐

  1. Alan Cox:单向链表中prev指针的妙用

    之前发过一篇二级指针操作单向链表的例子,显示了C语言指针的灵活性,这次再探讨一个指针操作链表的例子,而且是一种完全不同的用法. 这个例子是linux-1.2.13网络协议栈里的,关于链表遍历& ...

  2. Leetcode 编程训练

    Leetcode这个网站上的题都是一些经典的公司用来面试应聘者的面试题,很多人通过刷这些题来应聘一些喜欢面试算法的公司,比如:Google.微软.Facebook.Amazon之类的这些公司,基本上是 ...

  3. mfc怎么显示jpg png图像

    如果是VS2005以上版本可以直接使用MFC自带的CImage类,如果不是可以用网上比较流行的CxImage,或者使用GDI+

  4. jms异步转同步调用实例

    思路: 当主线程调用异步方法时,将自己挂起,并把引用交给jms的监听: 当监听收到返回的消息时,处理并唤醒主线程继续执行(可以获取和处理返回的消息) Test.java package com.my. ...

  5. js 万恶之源 是否滚动到底部?

    let scrollHandle = (el) => { // 如果已经滚到底部了 if (el.scrollHeight - el.scrollTop === el.clientHeight) ...

  6. 使用cronolog自动分割apache的日志。

    为了方便分析网站的日志,需要将apache的日志按周来分割,网上搜索了下,cronolog可以完成这个功能,实际操作了下,操作过程中参考了这篇文章(http://www.lampbo.org/linu ...

  7. js刷新小知识点

    data.code == '200' ? window.location.reload() : alert('拷贝失败,请重试') #如果状态码是200就刷新页面,如果不是就提示拷贝失败,请重试 页面 ...

  8. 有用的 Mongo命令行 db.currentOp() db.collection.find().explain() - 摘自网络

    在Heyzap 和 Bugsnag 我已经使用MongoDB超过一年了,我发现它是一个非常强大的数据库.和其他的数据库一样,它有一些缺陷,但是这里有一些东西我希望有人可以早一点告诉我的. 即使建立索引 ...

  9. SaaS多租户模式数据存储方案

    云计算多租户几乎用于所有软件即服务 (Software as a Service, SaaS) 应用程序,因为计算资源是可伸缩的,而且这些资源的分配由实际使用决定.话虽如此,用户可以通过 Intern ...

  10. JDK1.5新特性,基础类库篇,浅谈并发工具包(Concurrency Utilities)

    java.util.concurrent, java.util.concurrent.atomic, 和 java.util.concurrent.locks 包提供了高性能的.可扩展的框架,保证开发 ...