lldb 脚本 - 断点写出(breakpoint write) 修复

lldb 有断点序列化的功能,即写出到文件和从文件读取:


然而默认的写出存在 bug(我是在安卓 arm/thumb 环境下发现和处理这些问题的,对于存在多个 location 的断点,可能会出错,不过此情况较少,暂时未去处理)。

1.缺失模块名称

lldb 永远不会写入 so 的名称。

2.缺失 section 偏移

断点写出时无法保存正确的断点偏移值,默认在 “AddressOffset” 字段会写入 section 偏移,然而却没有字段保存 section 相对于库的偏移。


下断并写出

写出的断点文件,无法正常使用

可以看到 84125(0x1489D) 并不是相对于 libc.so 的偏移且无其他任何偏移值可计算该断点位置,也未见写入 libc.so 的名称;

读断点出错
插件修复的断点文件

插件将 AddressOffset 直接修改为相对于 so 的偏移,且增加了 so 的名称;


保存并读取

插件使用方法

  1. 下载插件: https://github.com/wizdzz/lldb_script/blob/master/breakpoint_write/breakpoint_write.py
  2. 在 lldb 中执行 command script import "path to breakpoint_write.py"
    或者 将该命令添加到 ~/.lldbinit 中(windows 下是 "C:\Users\Administrator.lldbinit",如果不存在,请自己创建它)。
  3. 执行 "bpw path_to_file" 命令写出断点文件,如果只提供文件名而没有路径,则会写出到控制台的当前路径。
  • 请注意,官方 lldb 并不支持 python 插件,你可以在这里下载支持 python 插件的版本:https://github.com/vadimcn/llvm/releases/download/r313613/LLVM-6.0.0-r313613-win32.exe;
    或者尝试自己编译(推荐!我会在以后的文章中介绍如何在 windows 下编译 lldb)。

你可能感兴趣的:(lldb 脚本 - 断点写出(breakpoint write) 修复)