缘起虽然豆瓣上老早就标注为想看了,但20190416偶然搜到的这本书,20190417开始看了40页左右,7个Hack,以目前的状况要看10个才能第1遍撸完。内容chap1 热身准备 19/419Hack1、调试是什么Hack2、Debug hacks的地图 22/419程序异常结束程序不结束strace命令基本没怎么用过呢,soft lookup也没有听过soft lockup和hard lockup介绍Hack3、调试的心得 24/419复现之前复现之后确认现象确认复现率和时间分析找不出原因作者把锅甩给硬件,哈哈—lionel找以前的同类bug这部分内容让我想到了,吴军说的专业和业余的区别。chap2 调试前的必知必会 31/419Hack4、获取进程的内核转储 31/419启用内核转储启用 ulimit -c unlimtedgdb -c core.* ./a.out //core文件 进程gdb l 5–这个可以看到文件的第几行?在调试core的时候?在专用目录中生成内核转储cat /etc/sysctl.conf修改kernel.core_pattern的值sysctrl -pLinux系统中sysctl命令详解 sysctl -p、sysctl -a、sysctl -wkernel.core_pattern中可设置的格式符使用用户模式辅助程序自助压缩内核转储文件exec gzip ->lionel,这个理解了,还没好好看呢启用整个系统的内核转储功能34/419Hack5、调试器的基本使用方法(之一) 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 regp/格式 变量寄存器可使用的格式单步执行next即nstep即s,进入函数内部。书中写错了nexti或stepi逐条执行汇编指令继续运行continue简写为c有种我之前不知道的,c 5表示5次遇到断点不停止,第6次遇到断点时才暂停执行。监视点watch <表达式> 这个使用得比较少删除断点和监视点delete <编号>即d 2或者d 2-10其它断点改变变量的值set variable <变量>=<表达式> 这个在我项目中,是有想过,但没找到解决方案生成内核转储文件generate-core-filegcore命令可以直接从命令行直接生成内核转储文件。Hack6、调试器的基本使用方法(之二) 50/419attach到进程attach pid 上回看人家调试的时候,就用了attach这个命令在gdb和进程分离时使用detach命令,这样进程可以继续运行info proc显示进程信息条件断点break 断点 if 条件,举例b iseq_compile if node==0condition 断点编号反复执行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/419chap4 应用程序调试实践 157/419Hack26、发生SIGSEGV,应用程序异常停止 157/419收获20190417看了Hack7,有一些小点不会,但80%都是用过的,后面项目中多实践。最好自已能写个例子,用于验证自已不知道的命令。