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