SlideShare a Scribd company logo
手把手教你玩转 GDB 小武哥 <http://www.wuzesheng.com> 2010.11
主要内容 1.  温故知新 --- 程序的秘密 2.  牛刀小试 ---GDB 初探 3.  大显身手 --- 玩转 GDB 4.  学而时习之 --- 总结回顾 07/14/11 http:/www.wuzesheng.com
本课程所讲内容都是基于 80x86 32 位平台 ,  在 64 位平台上某些内容可能会略有差别,请大家注意区别! 07/14/11 手把手教你玩转 GDB--ZeshengWu
1.  温故知新 --- 程序的秘密 ( 1 ) GCC 做了什么 ( 2 )进程地址空间 07/14/11 手把手教你玩转 GDB--ZeshengWu
( 1 ) GCC 做了什么 gcc hello_world.c –o hello_world 07/14/11 手把手教你玩转 GDB--ZeshengWu
( 1 ) GCC 做了什么 07/14/11 手把手教你玩转 GDB--ZeshengWu
( 1 ) GCC 做了什么 A.  预处理 gcc –E hello_world.c –o hello_world.i ( 调用 cpp 完成 ) 任务:展开宏,替换头文件,删除注释 B.  编译 gcc –S hello_world.i –o hello_world.s( 调用 ccl , cclplus 完成 ) 任务:通过词法分析、语法分析和语义分析等一系列过程,生成汇编代码 C.  汇编 gcc –c hello_world.s –o hello_world.o( 调用 as 完成 ) 任务:将汇编代码转换成为机器可以执行指令 D.  链接 gcc hello_world.o –o hello_world( 调用 ld 完成 ) 任务:地址和空间分配,符号决议定位,将目标文件拼装成可执行文件 07/14/11 手把手教你玩转 GDB--ZeshengWu 总结 — GCC 实际上只是对多个工具的包装,它会根据不同的参数,去调用 cpp 、 ccl(cclplus) 、 as 或者 ld 去完成程序编译过程中的一系列工作
( 2 )进程地址空间 07/14/11 手把手教你玩转 GDB--ZeshengWu
( 2 )进程地址空间 07/14/11 手把手教你玩转 GDB--ZeshengWu
2. 牛刀小试 ---GDB 初探 ( 1 )启动 GDB 开始调试 ( 2 )常用调试命令介绍 ( 3 )退出 GDB 结束调试 ( 4 )寻求帮助 07/14/11 手把手教你玩转 GDB--ZeshengWu
( 1 )启动 GDB 开始调试 A. 准备工作 编译调试版本的可执行程序 (gcc 加上 -g 参数即可 , 注意不要调试加 -O 相关的选项 ) B. 冷启动 gdb   program  e.g., gdb ./cs gdb   –p  pid  e.g., gdb –p `pidof cs` gdb   program   core  e.g., gdb ./cs core.xxx C. 热启动 (gdb)  attach   pid  e.g.,  (gdb)  attach 2313 D.  命令行参数 gdb   program   --args  arglist (gdb)  set   args   arglist (gdb)  run   arglist 07/14/11 手把手教你玩转 GDB--ZeshengWu
( 2 )常用调试命令介绍 A.  在 GDB 中执行 shell 命令  (gdb)  shell   command   args shell 小技巧 —可以在 GDB 中直接执行 shell 命令,这样就会暂时退出 GDB,  回到 shell 终端, 在 shell 执行完 command 后,然后在 shell 中执行 exit 命令,便可回到 GDB 07/14/11 手把手教你玩转 GDB--ZeshengWu
( 2 )常用调试命令介绍 B.  在 GDB 中调用 make (gdb)  make   make-args (= shell   make   make-args ) 07/14/11 手把手教你玩转 GDB--ZeshengWu
( 2 )常用调试命令介绍 C.  断点 (Breakpoints) a.  设置断点: (gdb)  break   function :  在函数 funtion 入口处设置断点 (gdb)   break   linenum :  在当前源文件的第 linenum 行处设置 断点 (gdb)   break   filename : linenum :  在名为 filename 的源文件的第 linenum 行处设置 断点 (gdb)   break   filename : function :  在名为 filename 的源文件中的 function 函数入口处设置 断点 (gdb)   break  args  if  cond :  args   为 上面讲到的任 意一种 参数 , 在 指定位置 设置一个 断点  ,  当 且仅但 cond 为 true 时, 该断点 生效 (gdb)   tbreak   args :  设置一个只停止一次的 断点 ,  args 与 break 命令的一样。这样的 断点 当第一次停下来后,就会 立即被 删除 (gdb)   rbreak   regex :  在所有符合正则表达式 regex 的 函数 处设置 breakpoint 07/14/11 手把手教你玩转 GDB--ZeshengWu
( 2 )常用调试命令介绍 C.  断点 (Breakpoints) b.  查看断点属性: (gdb)   info   breakpoints  [ n ]: 查看第 n 个 断点 的相关信息,如果 没有指定 n ,则显示所有 断点 的相关信息 07/14/11 手把手教你玩转 GDB--ZeshengWu
( 2 )常用调试命令介绍 C.  断点 (Breakpoints) c.  断点禁用 / 启用: (gdb)   disable  [ breakpoints ] [ range …]:  禁用由 range 指定的范围内的 breakpoints (gdb)   enable  [ breakpoints ] [ range …]:  启用由 range 指定的范围内的 breakpoints (gdb)   enable  [ breakpoints ]  once  [ range …]:  只启用一次由 range 指定的范围内的 breakpoints ,等程序停下来后,自动设为禁用 (gdb)   enable  [ breakpoints ]  delete  [ range …]:  启用 range 指定的范围内的 breakpoints ,等程序停下来后,这些 breakpoints 自动被删除 07/14/11 手把手教你玩转 GDB--ZeshengWu
( 2 )常用调试命令介绍 C.  断点 (Breakpoints) d.  条件断点: (gdb)   break  args  if  cond :  设置条件断点 (gdb)   condition   bnum  [ cond-expr ]:  当指定 cond-expr 时,给第 bnum 个断点设置条件;当未指定 cond-expr 时,取消第 bnum 个断点的条件  (gdb)   ignore   bnum   count :  忽略第 bnum 个断点 count 次 07/14/11 手把手教你玩转 GDB--ZeshengWu
( 2 )常用调试命令介绍 C.  断点 (Breakpoints) e.  在断点处自动执行命令 (gdb)   commands  [ bnum ] …  command-list … end 在第 bnum 个 断点 处停下来后,执行由 command-list 指定的命令串,如果没有指定 bnum ,则对最后一个 断点 生效 (gdb)   commands  [ bnum ] end 取消第 bnum 个断点处的命令列表 07/14/11 手把手教你玩转 GDB--ZeshengWu
( 2 )常用调试命令介绍 C.  断点 (Breakpoints) e.  在断点处自动执行命令 07/14/11 手把手教你玩转 GDB--ZeshengWu
( 2 )常用调试命令介绍 C.  断点 (Breakpoints) f.  清理断点: (gdb)   clear   function  &  clear   filename:function :  清除函数 function 入口处的 断点  (gdb)   clear   linenum  &  clear   filename:linenum :  清除第 linenum 行处的 断点 (gdb)   delete  [ breakpoints ] [ range …]:  删除由 range 指定的范围内的 breakpoints , range 范围是指 断点 的序列号的范围 07/14/11 手把手教你玩转 GDB--ZeshengWu
( 2 )常用调试命令介绍 C.  断点 (Breakpoints) g.  未决的断点— pending breakpoints : (gdb)   set breakpoint pending auto : GDB 缺省设置,询问用户是否要设置 pending breakpoint (gdb)   set breakpoint pending on : GDB 当前不能识别的 breakpoint 自动成为 pending breakpoint (gdb)   set breakpoint pending off : GDB 当前不能识别某个 breakpoint 时,直接报错 (gdb)   show breakpoint pending :  查看 GDB 关于 pending breakpoint 的设置的行为 (auto, on, off) 07/14/11 手把手教你玩转 GDB--ZeshengWu
( 2 )常用调试命令介绍 C.  断点 (Breakpoints) h. Watchpoints 和 Catchpoints : 1 ) Watchpoint 的作用是让程序在某个表达式的值发生变化的时候停止运行,达到‘监视’该表达式的目的 (gdb)   watch   expr   e.g. watch CrawlServer::m_nTaskNum 2 ) Catchpoints 的作用是让程序在发生某种事件的时候停止运行,比如 C++ 中发生异常事件,加载动态库事件 ,系统调用事件 (gdb)   catch   event   e.g. catch throw 3 ) Watchpoints 和 Catchpoints 都与 Breakpoints 很相像,都有 enable/disabe/delete 等操作,使用方法也与 breakpoints 的类似 07/14/11 手把手教你玩转 GDB--ZeshengWu
( 2 )常用调试命令介绍 D.  单步调试 a.  设置断点(参见前面《 C. 断点》一节) b. next & nexti (gdb)   next  [ count ] : 如果没有指定 count ,  单步执行下一行程序;如果指定了 count ,单步执行接下来的 count 行程序 (gdb)   nexti  [ count ] : 如果没有指定 count,  单步执行下一条指令;如果指定了 count,  单步 执行接下来的 count 条 指令 c. step & stepi (gdb)   step  [ count ] : 如果没有指定 count ,  则继续执行程序,直到到达 与当前源文件 行 不同的 行 时停止 执行 ;如果指定了 count ,  则重复行上面的过程 count 次 07/14/11 手把手教你玩转 GDB--ZeshengWu
( 2 )常用调试命令介绍 D.  单步调试 c. step & stepi (gdb)   stepi  [ count ] : 如果没有指定 count ,  继续执行下一条机器指令,然后停止;如果指定了 count ,则重复上面的过程 count 次 d. continue (gdb)  continue  [ ignore-count ] : 唤醒程序,继续运行,至到遇到下一个断点,或者程序结束。如果指定 ignore-count ,那么程序在接下来的运行中,忽略 ignore-count 次断点。 e. finish & return (gdb)  finish : 继续执行程序,直到当前被调用的函数结束,如果该函数有返回值,把返回值也打印到控制台 (gdb)  return  [ expr ] : 中止当前函数的调用,如果指定了 expr ,把 expr 的 值当做当前函数的返回值;如果没有,直接结束当前函数调用 07/14/11 手把手教你玩转 GDB--ZeshengWu nexti 和 stepi 的区别 --nexti 在执行某机器指令时,如果该指令是函数调用,那么程序执行直到该函数调用结束时才停止
( 2 )常用调试命令介绍 E.  变量与内存查看 a. print :查看变量 (gdb)  print  [/ f ]  expr :以 f 指定的格式打印 expr 的值 f : x --- 16 进制整数  d --- 10 进制整数  u ---10 进制无符号整数 o --- 8 进制整数  t --- 2 进制整数  a ---  地址  c ---  字符  f ---  浮点数 expr :  1)  Any kind of  constant ,  variable  or  operator  defined by the programming language you are using is valid in an expression in GDB. 2)  (gdb)  p   * array @ len  :  打印数组 array 的前 len 个元素 3)  (gdb)  p   file :: variable :打印文件 file 中的变量 variable 4)  (gdb)  p   function :: variable :  打印函数 function 中的变量 variable 5)  (gdb)  p  { type } address : 把 address 指定的内存解释为 type 类型(类似于强制转型,更加强) 07/14/11 手把手教你玩转 GDB--ZeshengWu
E.  变量与内存查看 a. print :查看变量 ( 2 )常用调试命令介绍 07/14/11 手把手教你玩转 GDB--ZeshengWu
( 2 )常用调试命令介绍 E.  变量与内存查看 b. x :查看内存 (gdb)  x  / nfu   addr n :  重复次数,缺省是 1 f :  打印的格式,除了 print 支持的格式外,还支持如下格式: s--- C 风格字符串, i--- 机器指令 缺省格式是 x u :  打印的单位大小,支持如下单位: b---byte, h---halfwords(2bytes), w---words(4bytes), g---giantwords(8bytes) 07/14/11 手把手教你玩转 GDB--ZeshengWu
( 2 )常用调试命令介绍 E.  变量与内存查看 c. display:  自动打印 (gdb)  display  / f   expr | addr :  以格式 f ,自动打印表达式 expr 或地址 addr (gdb)  undisplay   dnums :  删除掉指定的自动打印点 , dnums 可以为一个或者多个自动打印点的序号 (gdb)  delete   display   dnums :  与  undisplay   dnums 同  (gdb)  disable   display   dnums :  禁用由 dnums 指定的自动打印点 (gdb)  enable   display   dnums :  启用由 dnums 指定的自动打印点 (gdb)  info   display :  查看当前所有自动打印点相关的信息 07/14/11 手把手教你玩转 GDB--ZeshengWu
( 2 )常用调试命令介绍 E.  变量与内存查看 d.  打印相关属性 基本用法: (gdb)  set   print   field  [on] :打开 field 指定的属性 (gdb)  set   print   field   off :关闭 field 指定的属性 (gdb)  show   print   field  :查看 filed 指定的属性的相关设置 相关属性: 1)  (gdb)  set print array :以一种比较好看的方式打印数组,缺省是关闭的 2)  (gdb)  set print elements   num-of-elements :设置 GDB 打印数据时显示元素的个数,缺省为 200 ,设为 0 表示不限制 (unlimited) 3)  (gdb)  set print null-stop :设置 GDB 打印字符数组的时候,遇到 NULL 时停止,缺省是关闭的 07/14/11 手把手教你玩转 GDB--ZeshengWu
( 2 )常用调试命令介绍 E.  变量与内存查看 d.  打印相关属性 4)  (gdb)  set print pretty :设置 GDB 打印结构的时候,每行一个成员,并且有相应的缩进,缺省是关闭的 5)  (gdb)  set print object :设置 GDB 打印多态类型的时候,打印实际的类型,缺省为关闭 6)  (gdb)  set print static-members :设置 GDB 打印结构的时候,是否打印 static 成员,缺省是打开的 7)  (gdb)  set print vtbl :以漂亮的方式打印 C++ 的虚函数表,缺省是关闭的 07/14/11 手把手教你玩转 GDB--ZeshengWu
( 2 )常用调试命令介绍 07/14/11 手把手教你玩转 GDB--ZeshengWu
( 3 )退出 GDB 结束调试 停止应用程序 (gdb)  kill : 杀掉当前 GDB 正在调试的应用程序所对应的子进程 (gdb)  detach : 停止调试当前正在调试 的 进程,与 attach 配对试用 退出 GDB (gdb)  End-of-File (ctrl+d) (gdb)  quit kill 小技巧 -- 不退出 GDB 而对 更新 当前正在调试的应用程序 : 在 GDB 中 用 kill 杀掉子进程, 然后直接更换应用程序可执行文件 ,再重新执行 run , GDB 便可加载新的可执行程序启动调试 07/14/11 手把手教你玩转 GDB--ZeshengWu
( 4 )寻求帮助 (gdb)  help   class-name :  查看 class-name 类别的帮助信息 (gdb)  help   all :  查看所有类别的帮助信息 (gdb)  help   command :  查看 command 命令的帮助信息 (gdb)  apropos   word :  查看 word 关键字相关的命令 (gdb)  complete   prefix :  查看以 prefix 为前缀的所有命令 07/14/11 手把手教你玩转 GDB--ZeshengWu
( 4 )寻求帮助 info :查看与被调试的应用程序相关的信息 show :查看 GDB 本身设置相关信息 07/14/11 手把手教你玩转 GDB--ZeshengWu
3. 大显身手 --- 玩转 GDB ( 1 )函数调用栈探密 ( 2 )调试中信号的响应 ( 3 )修改程序运行、源码 ( 4 )多线程调试 ( 5 )自定义命令 07/14/11 手把手教你玩转 GDB--ZeshengWu
( 1 )函数调用栈探密 A. Stack frame( 栈桢 ) & Call stack( 调用栈 ) Stack frame 是指保存函数调用上下文信息的一段区域 Call stack 是用来存放各个 Stack frame 的一块内存区域 07/14/11 手把手教你玩转 GDB--ZeshengWu
( 1 )函数调用栈探密 B.  查看 Call stack 相关信息 (gdb)  backtrace : 显示程序的调用栈信息,可以用 bt 缩写 (gdb)  backtrace   n : 显示程序的调用栈信息,只显示栈顶 n 桢 (gdb)  backtrace   – n : 显示程序的调用栈信息,只显示栈底部 n 桢 (gdb)  set   backtrace   limit   n :  设置 bt 显示的最大桢层数 ,缺省没有限制 (gdb)  where ,  info   stack :  bt 的别名 07/14/11 手把手教你玩转 GDB--ZeshengWu
( 1 )函数调用栈探密 C.  查看 Stack frame 信息 (gdb)  frame   n :  查看第 n 桢的简要信息 (gdb)  info   frame   n : 查看第 n 桢的详细信息 简要信息:桢号, $pc,  函数名,函数参数名和参数值,源文件名和行号 详细信息:当前桢地址,上一桢 $eip(pc),  函数名,源文件名和行号,本桢的 $eip ,上一桢地址,下一桢地址,源码语言,参数列表地址,各参数的值,局部变量地址,上一桢的 $sp ,保存的一些寄存器 07/14/11 手把手教你玩转 GDB--ZeshengWu
( 1 )函数调用栈探密 C.  查看 Stack frame 信息 (gdb)  info   locals : 查看当前桢中 函数 的参数 相关信息 (gdb)  info   args :  查看当前桢中的局部变量 相关信息 07/14/11 手把手教你玩转 GDB--ZeshengWu
( 2 )调试中信号的响应 GDB 可以检测到应用程序运行时收到的信号,可以通过命令提前设置当收到指定信息时的处理情况。 07/14/11 手把手教你玩转 GDB--ZeshengWu Question — 如何在 GDB 调试这个程序的时候,让这个程序收到 SIGINT 信号 ?
( 2 )调试中信号的响应 A.  handle   signal (gdb)  handle   signal  [ keywords ]:  如果没指定 keywords ,  该命令查看 GDB 对 signal 的当前的处理情况;如果指定了 keywords ,则是设置 GDB 对 signal 的处理属性,   keywords 就是要设置的属性 signal :  可以为整数或符号形式的信号名, e.g. SIGINT 和 2 是同一信号 keywords : print  &  noprint :  print 收到指定的信号 , 打印出一条信息 ;  noprint 与 print 相反 stop  &  nostop :  nostop 表示 收到指定的信号,不停止程序的执行,只打印出一条收到信号的消息 , 因此 , nostop 也暗含 print ,  stop 与 nostop 相反 pass  &  nopass :  pass 表示收到指定的信号,把该信号通知给应用程序 ;  nopass 与 pass 相反  ignore  &  noignore:ingore 与 noignore 分别是 nopass 和 pass 的别名 07/14/11 手把手教你玩转 GDB--ZeshengWu
( 2 )调试中信号的响应 A.  handle   signal 07/14/11 手把手教你玩转 GDB--ZeshengWu
( 2 )调试中信号的响应 B.  查看 GDB 对各种信号的缺省处理 (gdb)  info   handle   &  (gdb)  info   signals 07/14/11 手把手教你玩转 GDB--ZeshengWu
( 3 )修改程序运行、源码 A.  修改程序的运行 (gdb)  print   v = value :  修改变量 v 的值并打印修改后的值 (gdb)  set  [ var ]  v = value :  修改变量 v 的值,如果 v 与 GDB 的某个属性名一样的话,需要在前面加 var 关键字 e.g.  (gdb)  set   var  print=1 (gdb)  whatis   v :  查看变量 v 的类型 (gdb)  signal   sig :  把信号 sig 发给被调试的程序 (gdb)  return  [ expression ]:  中止当前函数的执行,返回 expression 值 (gdb)  finish :  结束当前函数的执行,打印出返回值 (gdb)  call   function  :  调用程序中的函数 function 07/14/11 手把手教你玩转 GDB--ZeshengWu
( 3 )修改程序运行、源码 B.  修改源码 1 )设置环境变量 : export EDITOR=/usr/bin/vim  2 )   (gdb)  edit :  编辑当前文件 3 )   (gdb)  edit   number :  编辑当前文件的第 number 行 4 )   (gdb)  edit   function :  编辑当前文件的 function 函数 5 )   (gdb)  edit   filename :  number :  编辑名为 filename 的文件的第 number 行 6 )   (gdb)  edit   filename :  function :  编辑名为 filename 的文件的 function 函数 07/14/11 手把手教你玩转 GDB--ZeshengWu 回忆 — 结合我们前面介绍的 shell, make, kill 和本节的 edit 命令,我们完全可以直接在 GDB 中完成很多的工作!
( 4 )多线程调试 A.  基本命令 (gdb)  info   threads :查看 GDB 当前调试的程序的各个线程的相关信息 (gdb)  thread   threadno :切换当前线程到由 threadno 指定的线程 (gdb)  thread   apply  [ threadno ] [ all ]  args :对指定(或所有)的线程执行由 args 指定的命令 B.  相关属性 (gdb)  set   scheduler-locking   mode :  设置程序运行过程中锁 scheduler 的模式: on:  除当前线程外的其它线程都被锁住,不可运行 off:  缺省情况,每个线程都会正常抢占 cpu 时间片 step:  在执行单步命令期间,其它线程不能运行 (gdb)  show   scheduler-locking :查看 当前的 scheduler-locking 模式设置 07/14/11 手把手教你玩转 GDB--ZeshengWu
( 5 )自定义命令 07/14/11 手把手教你玩转 GDB--ZeshengWu Question — 如何在 GDB 查看这个 list 里面的每个元素 ?
( 5 )自定义命令 A.  自定义命令基本语法 1 )定义一个命令 define   commandname   …   end 2 )条件语句: if   cond-expr … else … end 07/14/11 手把手教你玩转 GDB--ZeshengWu 3 )循环语句: while   cond-expr … end 4 )定义一个命令的文档信息,在 help   commandname 的时候可以显示: document   commandname  …   end 5)  $arg0…$arg9 :表示命令行参数,最多 10 个
( 5 )自定义命令 B.  查看用户自定义命令 (gdb)  help   user-defined :查看所有的用户自定义命令 (gdb)  show   user   commandname :查看自定义命令 commandname 的定义 (gdb)  help   commandname :查看自定义命令 commandname 的帮助信息 (gdb)  show   max-user-call-depth :查看用户自定义命令的最大递归调用深度,缺省是 1024 (gdb)  set   max-user-call-depth :设置用户自定义命令的最大递归调用深度 07/14/11 手把手教你玩转 GDB--ZeshengWu
( 5 )自定义命令 C. plist 实现 /usr/include/c++/4.1.2/bits/stl_list.h 07/14/11 手把手教你玩转 GDB--ZeshengWu
( 5 )自定义命令 C. plist 实现 07/14/11 手把手教你玩转 GDB--ZeshengWu
( 5 )自定义命令 C. plist 实现 1) 将 plist 的实现放到 ~/.gdbinit 文件中 2 ) 07/14/11 手把手教你玩转 GDB--ZeshengWu
( 5 )自定义命令 C. plist 实现 07/14/11 手把手教你玩转 GDB--ZeshengWu
4. 学而时习之 --- 总结回顾 ( 1 )常见的 coredump 原因 a. Signal 6(SIGABRT):  New 失败:内存泄露造成内存不够 Delete 失败:多次 delete 同一块内存 应用程序抛出的异常 b. Signal 11(SIGSEGV):  多为内存越界,访问已经被 delete 掉的内存 c. Signal 13(SIGPIPE):  写已经被删除的文件,写对方已经关闭的 socket ( 2 )参考资料 http ://www.gnu.org/software/gdb/documentation / 《 The Art of Assembly Language 》  《 Understanding the Linux Kernel 》  《程序员的自我修养 --- 链接、装载与库》 07/14/11 手把手教你玩转 GDB--ZeshengWu
07/14/11 手把手教你玩转 GDB--ZeshengWu

More Related Content

PDF
少年科技人雜誌 2015 年八月
PDF
08上半年软设上午试题
PDF
COSCUP 2014 : open source compiler 戰國時代的軍備競賽
PDF
Android C Library: Bionic 成長計畫
PPTX
Golangintro
PDF
COSCUP 2016 - LLVM 由淺入淺
PDF
ch13-pv1-system-calls
PDF
ch7-pv1-modules
少年科技人雜誌 2015 年八月
08上半年软设上午试题
COSCUP 2014 : open source compiler 戰國時代的軍備競賽
Android C Library: Bionic 成長計畫
Golangintro
COSCUP 2016 - LLVM 由淺入淺
ch13-pv1-system-calls
ch7-pv1-modules

Viewers also liked (9)

PPSX
Renown Media
PPSX
Renown Pr & Media Consultants
PPSX
Opening opportunities in Pakistan
PDF
WriteyBoard Product Catalog 2016
PDF
WriteyBoard Sales Catalog 2016
PDF
WriteyBoard Dry Erase Paint
PDF
Business plan of pole vaulters school
PPTX
USAID Interventions and Results in Agriculture Exports at Dawn Expo
PDF
Business plan of jermyn street school
Renown Media
Renown Pr & Media Consultants
Opening opportunities in Pakistan
WriteyBoard Product Catalog 2016
WriteyBoard Sales Catalog 2016
WriteyBoard Dry Erase Paint
Business plan of pole vaulters school
USAID Interventions and Results in Agriculture Exports at Dawn Expo
Business plan of jermyn street school
Ad

Similar to 手把手教你玩转Gdb (20)

PPTX
Gdb实用技巧
PPS
基于Android ndk的软件开发简介 放映
PPS
基于Android ndk的软件开发简介 放映
PDF
Android GDB Debugging (Chinese)
PDF
recover_pdb 原理與介紹
PDF
Gdb principle
PPTX
Git使用入门
PDF
Dbabc.net 利用heartbeat + drbd搭建my sql高可用环境
PDF
How to debug using GDB
PDF
在 golang 中透過組合語言實作 SIMD
PDF
C++工程实践
PPT
Mongo简介
PPTX
Git入門介紹
PPTX
mysql dbug
PPT
Lvm 解析
PDF
Git Branch Practice
PPTX
GIT實務操作與理論
PPTX
Groovy Introduction for Java Programmer
PPT
Hadoop Map Reduce 程式設計
PDF
用Raspberry PI學Linux驅動程式
Gdb实用技巧
基于Android ndk的软件开发简介 放映
基于Android ndk的软件开发简介 放映
Android GDB Debugging (Chinese)
recover_pdb 原理與介紹
Gdb principle
Git使用入门
Dbabc.net 利用heartbeat + drbd搭建my sql高可用环境
How to debug using GDB
在 golang 中透過組合語言實作 SIMD
C++工程实践
Mongo简介
Git入門介紹
mysql dbug
Lvm 解析
Git Branch Practice
GIT實務操作與理論
Groovy Introduction for Java Programmer
Hadoop Map Reduce 程式設計
用Raspberry PI學Linux驅動程式
Ad

手把手教你玩转Gdb

  • 1. 手把手教你玩转 GDB 小武哥 <http://www.wuzesheng.com> 2010.11
  • 2. 主要内容 1. 温故知新 --- 程序的秘密 2. 牛刀小试 ---GDB 初探 3. 大显身手 --- 玩转 GDB 4. 学而时习之 --- 总结回顾 07/14/11 http:/www.wuzesheng.com
  • 3. 本课程所讲内容都是基于 80x86 32 位平台 , 在 64 位平台上某些内容可能会略有差别,请大家注意区别! 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 4. 1. 温故知新 --- 程序的秘密 ( 1 ) GCC 做了什么 ( 2 )进程地址空间 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 5. ( 1 ) GCC 做了什么 gcc hello_world.c –o hello_world 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 6. ( 1 ) GCC 做了什么 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 7. ( 1 ) GCC 做了什么 A. 预处理 gcc –E hello_world.c –o hello_world.i ( 调用 cpp 完成 ) 任务:展开宏,替换头文件,删除注释 B. 编译 gcc –S hello_world.i –o hello_world.s( 调用 ccl , cclplus 完成 ) 任务:通过词法分析、语法分析和语义分析等一系列过程,生成汇编代码 C. 汇编 gcc –c hello_world.s –o hello_world.o( 调用 as 完成 ) 任务:将汇编代码转换成为机器可以执行指令 D. 链接 gcc hello_world.o –o hello_world( 调用 ld 完成 ) 任务:地址和空间分配,符号决议定位,将目标文件拼装成可执行文件 07/14/11 手把手教你玩转 GDB--ZeshengWu 总结 — GCC 实际上只是对多个工具的包装,它会根据不同的参数,去调用 cpp 、 ccl(cclplus) 、 as 或者 ld 去完成程序编译过程中的一系列工作
  • 8. ( 2 )进程地址空间 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 9. ( 2 )进程地址空间 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 10. 2. 牛刀小试 ---GDB 初探 ( 1 )启动 GDB 开始调试 ( 2 )常用调试命令介绍 ( 3 )退出 GDB 结束调试 ( 4 )寻求帮助 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 11. ( 1 )启动 GDB 开始调试 A. 准备工作 编译调试版本的可执行程序 (gcc 加上 -g 参数即可 , 注意不要调试加 -O 相关的选项 ) B. 冷启动 gdb program e.g., gdb ./cs gdb –p pid e.g., gdb –p `pidof cs` gdb program core e.g., gdb ./cs core.xxx C. 热启动 (gdb) attach pid e.g., (gdb) attach 2313 D. 命令行参数 gdb program --args arglist (gdb) set args arglist (gdb) run arglist 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 12. ( 2 )常用调试命令介绍 A. 在 GDB 中执行 shell 命令 (gdb) shell command args shell 小技巧 —可以在 GDB 中直接执行 shell 命令,这样就会暂时退出 GDB, 回到 shell 终端, 在 shell 执行完 command 后,然后在 shell 中执行 exit 命令,便可回到 GDB 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 13. ( 2 )常用调试命令介绍 B. 在 GDB 中调用 make (gdb) make make-args (= shell make make-args ) 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 14. ( 2 )常用调试命令介绍 C. 断点 (Breakpoints) a. 设置断点: (gdb) break function : 在函数 funtion 入口处设置断点 (gdb) break linenum : 在当前源文件的第 linenum 行处设置 断点 (gdb) break filename : linenum : 在名为 filename 的源文件的第 linenum 行处设置 断点 (gdb) break filename : function : 在名为 filename 的源文件中的 function 函数入口处设置 断点 (gdb) break args if cond : args 为 上面讲到的任 意一种 参数 , 在 指定位置 设置一个 断点 , 当 且仅但 cond 为 true 时, 该断点 生效 (gdb) tbreak args : 设置一个只停止一次的 断点 , args 与 break 命令的一样。这样的 断点 当第一次停下来后,就会 立即被 删除 (gdb) rbreak regex : 在所有符合正则表达式 regex 的 函数 处设置 breakpoint 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 15. ( 2 )常用调试命令介绍 C. 断点 (Breakpoints) b. 查看断点属性: (gdb) info breakpoints [ n ]: 查看第 n 个 断点 的相关信息,如果 没有指定 n ,则显示所有 断点 的相关信息 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 16. ( 2 )常用调试命令介绍 C. 断点 (Breakpoints) c. 断点禁用 / 启用: (gdb) disable [ breakpoints ] [ range …]: 禁用由 range 指定的范围内的 breakpoints (gdb) enable [ breakpoints ] [ range …]: 启用由 range 指定的范围内的 breakpoints (gdb) enable [ breakpoints ] once [ range …]: 只启用一次由 range 指定的范围内的 breakpoints ,等程序停下来后,自动设为禁用 (gdb) enable [ breakpoints ] delete [ range …]: 启用 range 指定的范围内的 breakpoints ,等程序停下来后,这些 breakpoints 自动被删除 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 17. ( 2 )常用调试命令介绍 C. 断点 (Breakpoints) d. 条件断点: (gdb) break args if cond : 设置条件断点 (gdb) condition bnum [ cond-expr ]: 当指定 cond-expr 时,给第 bnum 个断点设置条件;当未指定 cond-expr 时,取消第 bnum 个断点的条件 (gdb) ignore bnum count : 忽略第 bnum 个断点 count 次 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 18. ( 2 )常用调试命令介绍 C. 断点 (Breakpoints) e. 在断点处自动执行命令 (gdb) commands [ bnum ] … command-list … end 在第 bnum 个 断点 处停下来后,执行由 command-list 指定的命令串,如果没有指定 bnum ,则对最后一个 断点 生效 (gdb) commands [ bnum ] end 取消第 bnum 个断点处的命令列表 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 19. ( 2 )常用调试命令介绍 C. 断点 (Breakpoints) e. 在断点处自动执行命令 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 20. ( 2 )常用调试命令介绍 C. 断点 (Breakpoints) f. 清理断点: (gdb) clear function & clear filename:function : 清除函数 function 入口处的 断点 (gdb) clear linenum & clear filename:linenum : 清除第 linenum 行处的 断点 (gdb) delete [ breakpoints ] [ range …]: 删除由 range 指定的范围内的 breakpoints , range 范围是指 断点 的序列号的范围 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 21. ( 2 )常用调试命令介绍 C. 断点 (Breakpoints) g. 未决的断点— pending breakpoints : (gdb) set breakpoint pending auto : GDB 缺省设置,询问用户是否要设置 pending breakpoint (gdb) set breakpoint pending on : GDB 当前不能识别的 breakpoint 自动成为 pending breakpoint (gdb) set breakpoint pending off : GDB 当前不能识别某个 breakpoint 时,直接报错 (gdb) show breakpoint pending : 查看 GDB 关于 pending breakpoint 的设置的行为 (auto, on, off) 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 22. ( 2 )常用调试命令介绍 C. 断点 (Breakpoints) h. Watchpoints 和 Catchpoints : 1 ) Watchpoint 的作用是让程序在某个表达式的值发生变化的时候停止运行,达到‘监视’该表达式的目的 (gdb) watch expr e.g. watch CrawlServer::m_nTaskNum 2 ) Catchpoints 的作用是让程序在发生某种事件的时候停止运行,比如 C++ 中发生异常事件,加载动态库事件 ,系统调用事件 (gdb) catch event e.g. catch throw 3 ) Watchpoints 和 Catchpoints 都与 Breakpoints 很相像,都有 enable/disabe/delete 等操作,使用方法也与 breakpoints 的类似 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 23. ( 2 )常用调试命令介绍 D. 单步调试 a. 设置断点(参见前面《 C. 断点》一节) b. next & nexti (gdb) next [ count ] : 如果没有指定 count , 单步执行下一行程序;如果指定了 count ,单步执行接下来的 count 行程序 (gdb) nexti [ count ] : 如果没有指定 count, 单步执行下一条指令;如果指定了 count, 单步 执行接下来的 count 条 指令 c. step & stepi (gdb) step [ count ] : 如果没有指定 count , 则继续执行程序,直到到达 与当前源文件 行 不同的 行 时停止 执行 ;如果指定了 count , 则重复行上面的过程 count 次 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 24. ( 2 )常用调试命令介绍 D. 单步调试 c. step & stepi (gdb) stepi [ count ] : 如果没有指定 count , 继续执行下一条机器指令,然后停止;如果指定了 count ,则重复上面的过程 count 次 d. continue (gdb) continue [ ignore-count ] : 唤醒程序,继续运行,至到遇到下一个断点,或者程序结束。如果指定 ignore-count ,那么程序在接下来的运行中,忽略 ignore-count 次断点。 e. finish & return (gdb) finish : 继续执行程序,直到当前被调用的函数结束,如果该函数有返回值,把返回值也打印到控制台 (gdb) return [ expr ] : 中止当前函数的调用,如果指定了 expr ,把 expr 的 值当做当前函数的返回值;如果没有,直接结束当前函数调用 07/14/11 手把手教你玩转 GDB--ZeshengWu nexti 和 stepi 的区别 --nexti 在执行某机器指令时,如果该指令是函数调用,那么程序执行直到该函数调用结束时才停止
  • 25. ( 2 )常用调试命令介绍 E. 变量与内存查看 a. print :查看变量 (gdb) print [/ f ] expr :以 f 指定的格式打印 expr 的值 f : x --- 16 进制整数 d --- 10 进制整数 u ---10 进制无符号整数 o --- 8 进制整数 t --- 2 进制整数 a --- 地址 c --- 字符 f --- 浮点数 expr : 1) Any kind of constant , variable or operator defined by the programming language you are using is valid in an expression in GDB. 2) (gdb) p * array @ len : 打印数组 array 的前 len 个元素 3) (gdb) p file :: variable :打印文件 file 中的变量 variable 4) (gdb) p function :: variable : 打印函数 function 中的变量 variable 5) (gdb) p { type } address : 把 address 指定的内存解释为 type 类型(类似于强制转型,更加强) 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 26. E. 变量与内存查看 a. print :查看变量 ( 2 )常用调试命令介绍 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 27. ( 2 )常用调试命令介绍 E. 变量与内存查看 b. x :查看内存 (gdb) x / nfu addr n : 重复次数,缺省是 1 f : 打印的格式,除了 print 支持的格式外,还支持如下格式: s--- C 风格字符串, i--- 机器指令 缺省格式是 x u : 打印的单位大小,支持如下单位: b---byte, h---halfwords(2bytes), w---words(4bytes), g---giantwords(8bytes) 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 28. ( 2 )常用调试命令介绍 E. 变量与内存查看 c. display: 自动打印 (gdb) display / f expr | addr : 以格式 f ,自动打印表达式 expr 或地址 addr (gdb) undisplay dnums : 删除掉指定的自动打印点 , dnums 可以为一个或者多个自动打印点的序号 (gdb) delete display dnums : 与 undisplay dnums 同 (gdb) disable display dnums : 禁用由 dnums 指定的自动打印点 (gdb) enable display dnums : 启用由 dnums 指定的自动打印点 (gdb) info display : 查看当前所有自动打印点相关的信息 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 29. ( 2 )常用调试命令介绍 E. 变量与内存查看 d. 打印相关属性 基本用法: (gdb) set print field [on] :打开 field 指定的属性 (gdb) set print field off :关闭 field 指定的属性 (gdb) show print field :查看 filed 指定的属性的相关设置 相关属性: 1) (gdb) set print array :以一种比较好看的方式打印数组,缺省是关闭的 2) (gdb) set print elements num-of-elements :设置 GDB 打印数据时显示元素的个数,缺省为 200 ,设为 0 表示不限制 (unlimited) 3) (gdb) set print null-stop :设置 GDB 打印字符数组的时候,遇到 NULL 时停止,缺省是关闭的 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 30. ( 2 )常用调试命令介绍 E. 变量与内存查看 d. 打印相关属性 4) (gdb) set print pretty :设置 GDB 打印结构的时候,每行一个成员,并且有相应的缩进,缺省是关闭的 5) (gdb) set print object :设置 GDB 打印多态类型的时候,打印实际的类型,缺省为关闭 6) (gdb) set print static-members :设置 GDB 打印结构的时候,是否打印 static 成员,缺省是打开的 7) (gdb) set print vtbl :以漂亮的方式打印 C++ 的虚函数表,缺省是关闭的 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 31. ( 2 )常用调试命令介绍 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 32. ( 3 )退出 GDB 结束调试 停止应用程序 (gdb) kill : 杀掉当前 GDB 正在调试的应用程序所对应的子进程 (gdb) detach : 停止调试当前正在调试 的 进程,与 attach 配对试用 退出 GDB (gdb) End-of-File (ctrl+d) (gdb) quit kill 小技巧 -- 不退出 GDB 而对 更新 当前正在调试的应用程序 : 在 GDB 中 用 kill 杀掉子进程, 然后直接更换应用程序可执行文件 ,再重新执行 run , GDB 便可加载新的可执行程序启动调试 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 33. ( 4 )寻求帮助 (gdb) help class-name : 查看 class-name 类别的帮助信息 (gdb) help all : 查看所有类别的帮助信息 (gdb) help command : 查看 command 命令的帮助信息 (gdb) apropos word : 查看 word 关键字相关的命令 (gdb) complete prefix : 查看以 prefix 为前缀的所有命令 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 34. ( 4 )寻求帮助 info :查看与被调试的应用程序相关的信息 show :查看 GDB 本身设置相关信息 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 35. 3. 大显身手 --- 玩转 GDB ( 1 )函数调用栈探密 ( 2 )调试中信号的响应 ( 3 )修改程序运行、源码 ( 4 )多线程调试 ( 5 )自定义命令 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 36. ( 1 )函数调用栈探密 A. Stack frame( 栈桢 ) & Call stack( 调用栈 ) Stack frame 是指保存函数调用上下文信息的一段区域 Call stack 是用来存放各个 Stack frame 的一块内存区域 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 37. ( 1 )函数调用栈探密 B. 查看 Call stack 相关信息 (gdb) backtrace : 显示程序的调用栈信息,可以用 bt 缩写 (gdb) backtrace n : 显示程序的调用栈信息,只显示栈顶 n 桢 (gdb) backtrace – n : 显示程序的调用栈信息,只显示栈底部 n 桢 (gdb) set backtrace limit n : 设置 bt 显示的最大桢层数 ,缺省没有限制 (gdb) where , info stack : bt 的别名 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 38. ( 1 )函数调用栈探密 C. 查看 Stack frame 信息 (gdb) frame n : 查看第 n 桢的简要信息 (gdb) info frame n : 查看第 n 桢的详细信息 简要信息:桢号, $pc, 函数名,函数参数名和参数值,源文件名和行号 详细信息:当前桢地址,上一桢 $eip(pc), 函数名,源文件名和行号,本桢的 $eip ,上一桢地址,下一桢地址,源码语言,参数列表地址,各参数的值,局部变量地址,上一桢的 $sp ,保存的一些寄存器 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 39. ( 1 )函数调用栈探密 C. 查看 Stack frame 信息 (gdb) info locals : 查看当前桢中 函数 的参数 相关信息 (gdb) info args : 查看当前桢中的局部变量 相关信息 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 40. ( 2 )调试中信号的响应 GDB 可以检测到应用程序运行时收到的信号,可以通过命令提前设置当收到指定信息时的处理情况。 07/14/11 手把手教你玩转 GDB--ZeshengWu Question — 如何在 GDB 调试这个程序的时候,让这个程序收到 SIGINT 信号 ?
  • 41. ( 2 )调试中信号的响应 A. handle signal (gdb) handle signal [ keywords ]: 如果没指定 keywords , 该命令查看 GDB 对 signal 的当前的处理情况;如果指定了 keywords ,则是设置 GDB 对 signal 的处理属性, keywords 就是要设置的属性 signal : 可以为整数或符号形式的信号名, e.g. SIGINT 和 2 是同一信号 keywords : print & noprint : print 收到指定的信号 , 打印出一条信息 ; noprint 与 print 相反 stop & nostop : nostop 表示 收到指定的信号,不停止程序的执行,只打印出一条收到信号的消息 , 因此 , nostop 也暗含 print , stop 与 nostop 相反 pass & nopass : pass 表示收到指定的信号,把该信号通知给应用程序 ; nopass 与 pass 相反 ignore & noignore:ingore 与 noignore 分别是 nopass 和 pass 的别名 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 42. ( 2 )调试中信号的响应 A. handle signal 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 43. ( 2 )调试中信号的响应 B. 查看 GDB 对各种信号的缺省处理 (gdb) info handle & (gdb) info signals 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 44. ( 3 )修改程序运行、源码 A. 修改程序的运行 (gdb) print v = value : 修改变量 v 的值并打印修改后的值 (gdb) set [ var ] v = value : 修改变量 v 的值,如果 v 与 GDB 的某个属性名一样的话,需要在前面加 var 关键字 e.g. (gdb) set var print=1 (gdb) whatis v : 查看变量 v 的类型 (gdb) signal sig : 把信号 sig 发给被调试的程序 (gdb) return [ expression ]: 中止当前函数的执行,返回 expression 值 (gdb) finish : 结束当前函数的执行,打印出返回值 (gdb) call function : 调用程序中的函数 function 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 45. ( 3 )修改程序运行、源码 B. 修改源码 1 )设置环境变量 : export EDITOR=/usr/bin/vim 2 ) (gdb) edit : 编辑当前文件 3 ) (gdb) edit number : 编辑当前文件的第 number 行 4 ) (gdb) edit function : 编辑当前文件的 function 函数 5 ) (gdb) edit filename : number : 编辑名为 filename 的文件的第 number 行 6 ) (gdb) edit filename : function : 编辑名为 filename 的文件的 function 函数 07/14/11 手把手教你玩转 GDB--ZeshengWu 回忆 — 结合我们前面介绍的 shell, make, kill 和本节的 edit 命令,我们完全可以直接在 GDB 中完成很多的工作!
  • 46. ( 4 )多线程调试 A. 基本命令 (gdb) info threads :查看 GDB 当前调试的程序的各个线程的相关信息 (gdb) thread threadno :切换当前线程到由 threadno 指定的线程 (gdb) thread apply [ threadno ] [ all ] args :对指定(或所有)的线程执行由 args 指定的命令 B. 相关属性 (gdb) set scheduler-locking mode : 设置程序运行过程中锁 scheduler 的模式: on: 除当前线程外的其它线程都被锁住,不可运行 off: 缺省情况,每个线程都会正常抢占 cpu 时间片 step: 在执行单步命令期间,其它线程不能运行 (gdb) show scheduler-locking :查看 当前的 scheduler-locking 模式设置 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 47. ( 5 )自定义命令 07/14/11 手把手教你玩转 GDB--ZeshengWu Question — 如何在 GDB 查看这个 list 里面的每个元素 ?
  • 48. ( 5 )自定义命令 A. 自定义命令基本语法 1 )定义一个命令 define commandname … end 2 )条件语句: if cond-expr … else … end 07/14/11 手把手教你玩转 GDB--ZeshengWu 3 )循环语句: while cond-expr … end 4 )定义一个命令的文档信息,在 help commandname 的时候可以显示: document commandname … end 5) $arg0…$arg9 :表示命令行参数,最多 10 个
  • 49. ( 5 )自定义命令 B. 查看用户自定义命令 (gdb) help user-defined :查看所有的用户自定义命令 (gdb) show user commandname :查看自定义命令 commandname 的定义 (gdb) help commandname :查看自定义命令 commandname 的帮助信息 (gdb) show max-user-call-depth :查看用户自定义命令的最大递归调用深度,缺省是 1024 (gdb) set max-user-call-depth :设置用户自定义命令的最大递归调用深度 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 50. ( 5 )自定义命令 C. plist 实现 /usr/include/c++/4.1.2/bits/stl_list.h 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 51. ( 5 )自定义命令 C. plist 实现 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 52. ( 5 )自定义命令 C. plist 实现 1) 将 plist 的实现放到 ~/.gdbinit 文件中 2 ) 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 53. ( 5 )自定义命令 C. plist 实现 07/14/11 手把手教你玩转 GDB--ZeshengWu
  • 54. 4. 学而时习之 --- 总结回顾 ( 1 )常见的 coredump 原因 a. Signal 6(SIGABRT): New 失败:内存泄露造成内存不够 Delete 失败:多次 delete 同一块内存 应用程序抛出的异常 b. Signal 11(SIGSEGV): 多为内存越界,访问已经被 delete 掉的内存 c. Signal 13(SIGPIPE): 写已经被删除的文件,写对方已经关闭的 socket ( 2 )参考资料 http ://www.gnu.org/software/gdb/documentation / 《 The Art of Assembly Language 》 《 Understanding the Linux Kernel 》 《程序员的自我修养 --- 链接、装载与库》 07/14/11 手把手教你玩转 GDB--ZeshengWu

Editor's Notes

  • #10: 在 64bits 的机器上,以 cat /proc/xxx/maps 所对应的为准!
  • #22: 未决的断点常见的是动态库中的
  • #24: 单步调试一节做快速简单介绍即可,大家对这一块相对比较熟悉
  • #30: 举例说明所有的打印属性
  • #37: 先介绍 stack frame 的概念 然后看图给大家一个直观影响 接下来再开始讲具体的命令
  • #38: 在程序当前执行到的那一桢, PC 不会被显示
  • #41: 先看例子,再抛出问题,然后带着问题讲下面的内容
  • #46: 缺省编辑器是 /bin/ex, linux 下没有安装