Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

กลยุทธ์การอินเจกต์

การดีบักและโปรไฟล์โปรแกรมเป็นส่วนสำคัญของการวิศวกรรมซอฟต์แวร์ โดยทั่วไปทำได้ผ่านการทำ 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 ที่สนับสนุนมัน)