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
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
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
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
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
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