《Debug Hacks》-读到Hack7

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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理