VKDevTool App黑盒調試工具

YvetteAbner 8年前發布 | 6K 次閱讀 iOS開發 移動開發

App內調試工具 Github VKDevTool

允許在

  • 在脫離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/

 

 本文由用戶 YvetteAbner 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!