VKDevTool App黑盒調試工具
允許在
- 在脫離Xcode Debug的情況下
- 黑盒真機情況下
進行App的調試工作,包括:
- 調試內存對象
- 打印內存數據
- 修改UI
- 查看NSLog
- 查看所有網絡請求記錄
- 查看App界面層級
方便在黑盒測試+內部體驗的環境下,發現Bug后,直接在Bug現場調試內存,分析問題
使用介紹
工程配置
- 將 VKDevTool 文件夾拖入工程文件
- 將 VKDevToolLogHeader.h 寫入pch,以便開啟NSLog的動態攔截記錄,不導入ConsoleLog模塊無法捕獲NSLog
- 可以修改 VKDevToolDefine.h 中的 #ifdef DEBUG 來進行自定義的編譯控制,如果不修改,默認Debug模式下VKDevTool工具才有效
編寫代碼
[VKDevTool enableDebugMode];
一行代碼即可開啟DevTool的功能,該功能內部有編譯控制,Release版本會自動失效,無需使用者在這行代碼外圍在套一層 #ifdef DEBUG
如何使用
進行完工程配置與寫入代碼之后可以通過如下方式,在App內打開工程模式菜單
- 模擬器下,使用鍵盤command+x快捷鍵喚起菜單
- 真機運行下,使用搖一搖喚起菜單
主菜單模塊包含4個模塊
- DebugScript
- ConsoleLog
- NetworkLog
- ViewHierarchy3D
VKDevTool采取模塊化設計,每個模塊Module都可以獨立分拆分離,同時支持用戶定義擴展自己的模塊,圖中的額外2個模塊為自定義模塊
黑盒調試功能DebugScript
- 在主菜單中選擇 DebugScript
- 按提示點選任意一個界面元素
- 進入代碼控制臺
- 上面是代碼輸入框
- 下面是輸出框
以上是一個預覽界面,上方輸入的代碼都是基于JSPatch的,所有JSPatch的語法規則這里都一模一樣可以使用,戳這里看JSPatch如何使用 JSPatch語法
- 真機搖一搖 or 模擬器Command+X 可以喚起DebugScript模塊子菜單
- 模擬器下如果輸入過代碼Command+X可能不好使,通過模擬器菜單 Shake Gesture 功能模擬搖一搖,依舊可以喚起
子菜單包含以下幾個功能
-
GetTarget :自動往輸入框中輸入getTarget的腳本代碼,執行以后print Target信息,便于后續直接調試target的任意內存數據和執行方法
-
Get TargetVC :自動往輸入框中輸入getTargetVC的腳本代碼,執行以后print Target所在的當前vc的信息,便于后續直接調試targetVC的任意內存數據和執行方法
-
ChangeTarget :自動往輸入框中輸入切換所選target的代碼,執行后,重新返回選擇target界面
-
ClearInput :清空輸入區域
-
ClearOutput :清空輸出區域
-
Exit :退出DebugScript
除此之外,DebugScript為JS代碼添加了一個功能print()函數,可以print任意OC對象,如果對象是View,還會有額外的frame等信息輸出
我們通過一個GIF動畫,大體看一下調試JS代碼如何使用,此處的Gif是舊的Gif,新版本的顏色樣式都已經調整,加了子菜單快捷方式,但是用法完全不變
日志攔截功能ConsoleLog
在PCH中加入了 VKDevToolLogHeader.h 后,本模塊會攔截所有NSLog打印日志,以及NSError生成記錄,在這個界面進行列表展示
- NSLog記錄采用宏覆蓋的方式,攔截接管了所有NSLog請求,以白色展現在界面內。
- NSError記錄采用Runtime Swizzle的方式,攔截了NSError的init,以紅色展現在界面內
真機搖一搖 or 模擬器Command+X 可以喚起ConsoleLog模塊子菜單
- NSError Hook:開啟和關閉NSError攔截
- Copy to Pasteboard:把所有日志信息拷貝到剪切板
- Search Keyword:在眾多日志中搜索關鍵字,關鍵字以藍色展示
- Exit:退出
網絡攔截功能NetworkLog
VKDevTool會采用NSURLProtocol的方案,攔截hook所有的http請求,一一記錄起來,以列表的形式,展現在NetworkLog模塊內
每個cell,都可以點擊查看每一條網絡請求的真實返回數據,并且支持復制到剪切板
真機搖一搖 or 模擬器Command+X 可以喚起NetworkLog模塊子菜單
- Network Hook:可以選擇開啟和關閉http攔截
- Change Filter:可以通過過濾器,過濾含有固定字符串的網絡請求,方便查找搜索
- Exit:退出
如果NetworkHook無效,查看是否是因為AFN sessionManager需要注冊NSURLProtocol導致的
NSURLSessionConfiguration *configuration= [NSURLSessionConfiguration defaultSessionConfiguration];
NSArray *protocolArray = @[[VKURLProtocol class]];
configuration.protocolClasses = protocolArray
頁面層級ViewHierarchy3D
VKDevTool采用YY大神開源的 YYViewHierarchy3D ,實現了這個頁面層級模塊
- 真機搖一搖 or 模擬器Command+X 可以喚起ViewHierarchy3D模塊子菜單
- 模擬器下Command+X可能不好使,通過模擬器菜單 Shake Gesture 功能模擬搖一搖,依舊可以喚起
其他擴展代碼
[VKDevTool changeNetworktModuleFilter:@“xxxxx”];
這個接口控制網絡請求HookLog的過濾器,只攔截含有xxxx字符串的http網絡請求,同時在DevTool內還可以通過菜單,修改網絡攔截過濾器
如果全都攔截,可以省略
[VKDevTool registKeyName:@"custom module name"withExtensionFunction:^{
//todo your code
}];
VKDevTool采取模塊化設計,每個模塊Module都可以獨立分拆分離,同時支持用戶定義擴展自己的模塊
這個接口用于給VKDevTool擴展主菜單模塊,可以省略不寫,只使用自帶的4個模塊。
來自:http://awhisper.github.io/2016/09/01/VKDevTool/