《Debug Hacks》-读到Hack7

 阅读约 7 分钟

缘起

  • 虽然豆瓣上老早就标注为想看了,但20190416偶然搜到的这本书,20190417开始看了40页左右,7个Hack,以目前的状况要看10个才能第1遍撸完。

内容

chap1 热身准备 19/419

Hack1、调试是什么

Hack2、Debug hacks的地图 22/419

Hack3、调试的心得 24/419

  • 复现之前
  • 复现之后

    • 确认现象
    • 确认复现率和时间
  • 分析
  • 找不出原因

    • 作者把锅甩给硬件,哈哈---lionel
    • 找以前的同类bug
这部分内容让我想到了,吴军说的专业和业余的区别

chap2 调试前的必知必会 31/419

Hack4、获取进程的内核转储 31/419

  • 启用内核转储

    • 启用 ulimit -c unlimted
    • gdb -c core.* ./a.out //core文件 进程
    • gdb l 5--这个可以看到文件的第几行?在调试core的时候?
  • 在专用目录中生成内核转储

  • 使用用户模式辅助程序自助压缩内核转储文件

    • 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,别名还有whereinfo stack简写成info s
    • 我主要用在调试core的时候了
    • bt N 只显示开头N个帧;bt -N只显示最后N个的帧;
    • bt full 3从外向内显示3个栈帧,及其局部变量。 这个就没用过
  • 显示变量

    • p 变量
  • 显示寄存器

    • info registers简称info reg
    • p/格式 变量

      • 寄存器可使用的格式
  • 单步执行

    • nextn
    • steps,进入函数内部。书中写错了
    • nextistepi逐条执行汇编指令
  • 继续运行

    • 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%都是用过的,后面项目中多实践。最好自已能写个例子,用于验证自已不知道的命令
阅读 341更新于 4月17日
推荐阅读
im天行
用户专栏

STL,C,C++,EntityFramework

163 人关注
25 篇文章
专栏主页
目录