กลยุทธ์การอินเจกต์
การดีบักและโปรไฟล์โปรแกรมเป็นส่วนสำคัญของการวิศวกรรมซอฟต์แวร์ โดยทั่วไปทำได้ผ่านการทำ instrumentation กับโปรแกรมที่กำลังสังเกตอยู่ (กล่าวคือ แทรกคำสั่งที่ให้ข้อมูลเชิงลึกเกี่ยวกับการทำงานเชิงพลวัตเข้าไป)
เทคนิค instrumentation ที่พบมากที่สุด เช่น การเขียนไบต์โค้ดใหม่ จะฉีดคำสั่งเข้าไปในโค้ดของแอปพลิเคชันโดยตรง แม้ว่าวิธีนี้จะทำให้ instrumentation รองรับโดเมนของแอปพลิเคชันได้แทบทุกประเภท แต่มันรุกล้ำพื้นที่สถานะของโปรแกรม (ซึ่งอาจนำมาซึ่งบั๊ก) ทำให้การนำไปใช้ซับซ้อนขึ้น จำกัดขอบเขตการสังเกต และไม่สามารถปรับตัวตามพฤติกรรมของโปรแกรมได้แบบพลวัต
อีกทางหนึ่ง เราสามารถแก้ปัญหาเหล่านี้ของการเขียนไบต์โค้ดใหม่ได้ด้วยการเชื่อมต่อกับเอนจินรันไทม์ที่รองรับ instrumentation โดยตรง เทคนิคนี้เปิดโอกาสให้นำความสามารถอันทรงพลังมาใช้ได้ ดังที่เอนจินวิจัยอย่าง Wizard สาธิตให้เห็นในเปเปอร์ ASPLOS เรื่อง Flexible Non-intrusive Dynamic Instrumentation for WebAssembly เปเปอร์นี้อธิบายวิธีสร้างการรองรับ instrumentation ที่ปกป้องแอปพลิเคชันที่กำลังสังเกต ให้การรับประกันความสอดคล้องเพื่อให้เครื่องมือประกอบกันได้ ใช้การปรับให้เหมาะที่สุดของ JIT ที่จำเพาะกับ instrumentation ซึ่งทำให้เครื่องมือบางตัวรันได้เร็วยิ่งกว่าการเขียนไบต์โค้ดใหม่เสียอีก และอื่นๆ อีกมาก อย่างไรก็ตาม เทคนิคนี้ยังไม่เป็นที่นิยมเท่าการเขียนไบต์โค้ดใหม่ เพราะจำกัดขอบเขตของเครื่องมือไว้เฉพาะแอปพลิเคชันที่รันบนเอนจินเหล่านี้ได้เท่านั้น
นี่คือจุดที่ Whamm เข้ามามีบทบาท
DSL นี้เป็นนามธรรมที่อยู่เหนือเทคนิค instrumentation ทำให้เครื่องมือของนักพัฒนารองรับแอปพลิเคชันได้หลากหลายโดเมน พร้อมใช้ความสามารถของรันไทม์เท่าที่มี โดยไม่ต้องนำกลับมาเขียนใหม่
ด้วย Whamm คุณเขียน instrumentation ครั้งเดียวและรองรับแอปได้หลากหลายโดเมน
ใช้ความสามารถ instrumentation ของเอนจินเท่าที่มี
ใช้การเขียนไบต์โค้ดใหม่เพื่อรองรับทุกอย่างที่เหลือ
การเขียนไบต์โค้ดใหม่
เมื่อใช้กลยุทธ์นี้ ต้องจัดหาไบต์โค้ดของแอปพลิเคชันเป้าหมายให้คอมไพเลอร์ Whamm ด้วย
เพื่อทำกลยุทธ์การอินเจกต์แบบเขียนไบต์โค้ดใหม่ Whamm ใช้ไลบรารี Rust ชื่อ wirm
ไลบรารีนี้โหลดโมดูล app.wasm เข้าเป็นตัวแทน AST ซึ่งสามารถท่องไปและปรับแต่งได้ เพื่อฉีด instrumentation เข้าไปในไบต์โค้ดของแอปพลิเคชันโดยตรง
อ่านรายละเอียดระดับต่ำเพิ่มเติมได้ในเอกสารสำหรับนักพัฒนา
แอปพลิเคชันที่ทำ instrumentation แล้วจะถูกส่งออกเป็นโมดูล Wasm ใหม่ ดังที่แสดงด้านบน (app.out.wasm)
การรองรับเอนจินโดยตรง (wei)##
ผู้ใช้ยังสามารถกำหนดเป้าหมายเป็นเอนจินที่รองรับ instrumentation โดยตรงผ่านส่วนต่อประสานที่ Whamm ใช้ได้
ปัจจุบันมีเอนจิน Wasm เพียงตัวเดียวที่ทำเช่นนี้ คือ Wizard
คุณอ่านเกี่ยวกับความสามารถด้าน instrumentation ของ Wizard ได้ในเปเปอร์ ASPLOS: Flexible Non-intrusive Dynamic Instrumentation for WebAssembly
คอมไพเลอร์ Whamm สร้างโมดูล Wasm ที่เข้ารหัส instrumentation ไว้ในแบบทั่วไป โดยไม่ผูกติดกับไบต์โค้ดของแอปพลิเคชันโดยตรง
หากสนใจ อ่านเอกสารเป้าหมายเอนจินของนักพัฒนาเพื่อดูรายละเอียดว่ามันทำงานอย่างไร
โปรดทราบว่า เมื่อใช้กลยุทธ์นี้ ไบต์โค้ดของแอปพลิเคชันเป้าหมายจะไม่ถูกจัดหาให้คอมไพเลอร์ Whamm
เนื่องจากเอนจินจะเป็นผู้ค้นหาจุดฉีด instrumentation ที่เหมาะสมในแอปพลิเคชัน และแนบคอลแบ็กที่เหมาะสมตอนรันไทม์ของแอปพลิเคชัน
ด้วยเหตุนี้ app.wasm จึงถูกจัดหาให้เอนจินตอนรันไทม์ในฐานะ “co-module” (โมดูล Wasm ที่เชื่อมต่อโดยตรงกับ instr.wasm ที่สนับสนุนมัน)