談談JSDebugger
務虛亂彈
JSDebugger開源地址: ofollow,noindex">https://github.com/SatanWoo/JSDebugger
這是一篇談談設計 JSDebugger
的總體設想,不會過於深究具體實現細節,後續會單獨探討一些涉及實現方面的過程。
讀過我之前部落格的朋友可能會記得我3-4月份的時候寫過一篇 動手製作一個簡易的iOS動態執行器 ,效果如下:
雖然這個效果還起來還不錯(有許多人問這個東西咋實現的,挺炫酷的),但是其實只是個原型而已,從設想構思到編碼實現沒有超過一天的時間。當時在博文裡面承諾發程式碼,想想實現的完善度還不夠,就準備完善後再繼續搞搞。不過後來由於我轉到其他組不繼續鑽研 iOS
,這事也就不了了之。
那為什麼現在又重新開搞呢? ,三點原因吧:
- 有朋友在群裡問我之前提過的
Mach-o
包瘦身方案怎麼也沒發文章? - 看到同事查非Crash產生的Bug的過程還是比較累。
- 蕭楊玉 太強了。
好,來說說前兩個原因:
- 第一點,有些文章為什麼後續不發,主要原因還是很多產出和收穫都是工作中和同事一起探討研究出來的,發出來一是洩漏了公司的資料(職業操守還是很重要的),二是相當於霸佔了一些別人的工作成果。比如說我之前寫的記憶體等等,對外發的一般都是隻和開原始碼相關的同時刪減了大部分略微關鍵的部分,所以導致有些讀者讀起來斷斷續續雲裡霧裡。
完整版的很多文章或者一些沒對外的技術研究,我都發在了公司的內網裡,歡迎加入阿里巴巴。
- 第二點,我之前有段時間負責手淘的穩定性,除了有堆疊的Crash問題外,更多是使用者反饋的使用異常以及毫無頭緒的奇怪現象。針對這種問題,我相信各家(甚至開源方案)一般都有自己的監控體系,比如日誌啊、埋點等等。但是怎麼說呢,從我的感受來看,都是使用起來偏繁瑣,而且 還依賴對應的開發把錯誤資訊等現場保留寫入到日誌內。 我想要的就是一個能像我在自己手機上除錯應用一樣除錯使用者手機的能力(前提是使用者授權同意),因此我就想做了一個這樣的工具。結合自己以前玩逆向的些許經歷,
Cycript
就提供了類似的能力,因此就想做一個類似的。
說了這麼多原因,其實都是給蕭楊玉太強了這個原因打掩護的,主要原因就是蕭楊玉太強了,寫這個JSDebugger是為了向他致敬學習。
JSDebugger
言歸正傳,回到 JSDebugger 本身,基於之前的程式碼,這次主要做了完整性的程式碼重構重寫以及功能完善上。
- 類方法呼叫
- 例項方法呼叫
- Setter & Getter的呼叫
- 可變引數的函式呼叫
- C Pointer的使用
- 基礎型別的使用
- 物件和類的使用
- 結構體的使用(目前支援
CGSize
,CGRect
,CGPoint
,正在開發自定義註冊介面) - 外掛化的擴充套件功能。
同時,為了更好的測試所寫的 JavaScript
程式碼,開發了玩具級別的 Playground
功能,每次實時修改檔案後儲存即可自動觸發 Reload
。
很多細節此文不表,但是有些功能上的實現還是比較用心的,比如支援了各種型別、個數的可變引數的函式呼叫,比如目前支援了 choose
和 introspect
的能力,二者配合可以對任意物件實時查詢其當前所有的屬性值。
而且,我對 JavaScriptCore
的使用可能和常規大家所屬性的 iOS JavaScriptCore
有所區別,利用更低層的設計思路,經過我實測:
更低層的設計橋接思路在 iOS
上同比基於 Objective-C
的使用方式可以節省 50% 的時間;同比在 Android
上使用開源的 JavaScriptCore
是 50分之一左右 的時間。
當然Android上比較主流的JS引擎室v8咯
具體快原因可以閱讀 動手製作一個簡易的iOS動態執行器 中涉及的 JavaScriptCore
上層原始碼分析以及閱讀我的 JSDebugger 原始碼。
目前 JSDebugger 還在不斷完善中,後續會把我更多的想法移植到裡面,總體規劃有幾個關鍵點:
-
實現一個互動式的編輯器(或者命令列),能夠讓大家寫
Objective-C
的程式碼自動轉換成 JSDebugger 的JS語法。以我目前的技術水準,還做不到Cycript
那種牛逼的Objective-C
和JavaScript
的混合語法模式。 -
實現遠端圖形化
Debug
能力。目前 JSDebugger 可以除錯資料,但是如果能像Reveal
一樣把操作介面和資料結合起來就會更有效的定位問題。
歡迎有想法的朋友一起來參與完善這個專案,開源地址如下:
https://github.com/SatanWoo/JSDebugger
https://github.com/SatanWoo/JSDebugger
https://github.com/SatanWoo/JSDebugger
當然,要是發現了任何的Bug或者使用上的疑惑、抑或是可以改進的點,也可以私聊我或者開 issue
。
最後
實現 JSDebugger 的過程,還是站在兩個傑出的專案肩膀上:
- Cycript
- JSPatch
我的思路是來自於 Cycript
,諸如結構體等許多方面的實現細節是參考了 JSPatch
。在這裡對這幾個專案的作者和程式碼貢獻者表示感謝!
此外,很多的技術方案是和 HookZZ 大神交流(主要是他教我)中學習而來,在這也特別感謝。也感謝頭條的謝大佬的程式碼貢獻以及寒神的 Code Style
整理。
當然, JSDebugger 在實現上還是有很多自己思考的部分,感興趣的讀者可以自行前往 JSDebugger的Github開源地址