缘起
虽然豆瓣上老早就标注为想看了,但 20190416 偶然搜到的这本书,20190417 开始看了 40 页左右,7 个 Hack,以目前的状况要看 10 个才能第 1 遍撸完。
内容
chap1 热身准备 19/419
Hack1、调试是什么
Hack2、Debug hacks 的地图 22/419
程序异常结束
程序不结束
strace 命令基本没怎么用过呢,soft lookup 也没有听过
soft lockup 和 hard lockup 介绍
Hack3、调试的心得 24/419
复现之前
复现之后
确认现象
确认复现率和时间
分析
找不出原因
作者把锅甩给硬件,哈哈 —lionel
找以前的同类 bug
这部分内容让我想到了,吴军说的专业和业余的区别。
chap2 调试前的必知必会 31/419
Hack4、获取进程的内核转储 31/419
启用内核转储
启用 ulimit -c unlimted
gdb -c core.* ./a.out //core 文件 进程
gdb l 5– 这个可以看到文件的第几行?在调试 core 的时候?
在专用目录中生成内核转储
cat /etc/sysctl.conf 修改 kernel.core_pattern 的值
sysctrl -p
Linux 系统中 sysctl 命令详解 sysctl -p、sysctl -a、sysctl -w
kernel.core_pattern 中可设置的格式符
使用用户模式辅助程序自助压缩内核转储文件
exec gzip ->
lionel,这个理解了,还没好好看呢
启用整个系统的内核转储功能
34/419
Hack5、调试器的基本使用方法(之一)36/419
准备
gcc -Wall -02 -g 源文件
Makefile 中指定 CFLAGS = -Wall -02 -g
使用 configure 脚本生成 Makefile,./configure CFLAGS=”-Wall -02 -g”
构建方法通常会写在 INSTALL、README 等文件中。
启动
$gdb 可执行文件名
设置断点
b file.c :110 // 通过指定文件名和行号,我第一次用时,不知道
break + 偏移量【暂停位置往后 3 行】这 2 个没用过
break - 偏移量
break * 地址
b 后面啥也不加,就会在下一行设置断点
info break 用于查看设置好的断点
运行
run 可以简写成 r,然后加参数
start 命令也可以?我也用得极少
显示栈帧
backtrace 简写 bt,别名还有 where 和 info stack 简写成 info s
我主要用在调试 core 的时候了
bt N 只显示开头 N 个帧;bt - N 只显示最后 N 个的帧;
bt full 3 从外向内显示 3 个栈帧,及其局部变量。这个就没用过
显示变量
p 变量
显示寄存器
info registers 简称 info reg
p/ 格式 变量
寄存器可使用的格式
单步执行
next 即 n
step 即 s,进入函数内部。书中写错了
nexti 或 stepi 逐条执行汇编指令
继续运行
continue 简写为 c
有种我之前不知道的,c 5 表示 5 次遇到断点不停止,第 6 次遇到断点时才暂停执行。
监视点
watch < 表达式 > 这个使用得比较少
删除断点和监视点
delete < 编号 > 即 d 2 或者 d 2-10
其它断点
改变变量的值
set variable < 变量 >=< 表达式 > 这个在我项目中,是有想过,但没找到解决方案
生成内核转储文件
generate-core-file
gcore 命令可以直接从命令行直接生成内核转储文件。
Hack6、调试器的基本使用方法(之二)50/419
attach 到进程
attach pid 上回看人家调试的时候,就用了 attach 这个命令
在 gdb 和进程分离时使用 detach 命令,这样进程可以继续运行
info proc 显示进程信息
条件断点
break 断点 if 条件,举例 b iseq_compile if node==0
condition 断点编号
反复执行
ignore 断点编号 次数
finish 命令执行完当前函数后暂停
until 命令执行完当前函数等代码块后暂停,执行完循环后暂停
删除断点和禁用断点
clear 删除已定义的断点
disable 临时禁用;enable 断点重新启用
disable display 显示编号
disable mem 内存区域
断点命令
commads 可以定义在断点中断后自动执行的命令。
常用命令及省略形式(别名)
x 显示内存内容
info 显示调试对象的各种各样的信息
list 显示函数或行
show 显示 GDB 内部的功能、变量和选项
Hack7、调试器的基本使用方法(之三)57/419
值的历史
最后的值可以用 p $ 来访问
show value 可以显示历史中的最后 10 个值。
变量
set $i=0,随意定义变量;p $i
命令历史
show history,命令历史文件们于./.gdb_history
初始化文件(.gdbinit)
命令定义
Hack8、Intel 架构的基本知识 63/419
chap4 应用程序调试实践 157/419
Hack26、发生 SIGSEGV,应用程序异常停止 157/419
收获
20190417 看了 Hack7,有一些小点不会,但 80% 都是用过的,后面项目中多实践。最好自已能写个例子,用于验证自已不知道的命令。