缘起
- 虽然豆瓣上老早就标注为想看了,但20190416偶然搜到的这本书,20190417开始看了40页左右,7个Hack,以目前的状况要看10个才能第1遍撸完。
内容
chap1 热身准备 19/419
Hack1、调试是什么
Hack2、Debug hacks的地图 22/419
- 程序异常结束
- 程序不结束
-
strace
命令基本没怎么用过呢,soft lookup也没有听过
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
- 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%都是用过的,后面项目中多实践。最好自已能写个例子,用于验证自已不知道的命令。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。