《Debug Hacks》-读到Hack7

63次阅读

共计 2050 个字符,预计需要花费 6 分钟才能阅读完成。

缘起
虽然豆瓣上老早就标注为想看了,但 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% 都是用过的,后面项目中多实践。最好自已能写个例子,用于验证自已不知道的命令。

正文完
 0