ขอแนะนำเครื่องมือตรวจสอบหน่วยความจำ

Kim-Anh Tran
Kim-Anh Tran

บทความนี้จะแนะนำเครื่องมือตรวจสอบหน่วยความจำที่พร้อมให้ใช้งานใน Chrome 91 ซึ่งช่วยให้คุณตรวจสอบ ArrayBuffer, TypedArray, DataView และ Wasm Memory ได้

บทนำ

เคยอยากทําความเข้าใจข้อมูลใน ArrayBuffer ไหม ก่อนที่จะมีเครื่องมือตรวจสอบหน่วยความจำ เครื่องมือสำหรับนักพัฒนาซอฟต์แวร์อนุญาตให้ดูข้อมูลเชิงลึกเกี่ยวกับ ArrayBuffer ได้เพียงบางส่วนเท่านั้น การตรวจสอบจากมุมมองขอบเขตระหว่างเซสชันการแก้ไขข้อบกพร่องถูกจํากัดให้ดูรายการค่าเดี่ยวภายในบัฟเฟอร์อาร์เรย์ ซึ่งทําให้ทําความเข้าใจข้อมูลโดยรวมได้ยาก ตัวอย่างเช่น มุมมองขอบเขตจะแสดงบัฟเฟอร์เป็นช่วงของอาร์เรย์ที่ขยายได้ในตัวอย่างด้านล่าง

มุมมองขอบเขตในเครื่องมือสำหรับนักพัฒนาเว็บ

การไปยังช่วงหนึ่งๆ ภายในบัฟเฟอร์เป็นปัญหาที่ผู้ใช้ต้องเลื่อนลงเพื่อไปยังดัชนีนั้น แต่แม้ว่าการไปยังตําแหน่งจะง่าย แต่วิธีตรวจสอบค่านี้กลับยุ่งยาก เนื่องจากจํานวนเหล่านี้มีความหมายที่เข้าใจยาก โดยเฉพาะอย่างยิ่ง จะเกิดอะไรขึ้นหากไม่ควรตีความเป็นไบต์เดี่ยว แต่ตีความเป็นจำนวนเต็ม 32 บิต

การตรวจสอบค่าโดยใช้เครื่องมือตรวจสอบหน่วยความจํา

เครื่องมือตรวจสอบหน่วยความจำ

ใน Chrome 91 เราจะเปิดตัวเครื่องมือตรวจสอบหน่วยความจำ ซึ่งเป็นเครื่องมือสำหรับตรวจสอบบัฟเฟอร์อาร์เรย์ ก่อนหน้านี้คุณอาจเคยเห็นเครื่องมือตรวจสอบหน่วยความจำเพื่อดูข้อมูลไบนารี ซึ่งจะแสดงเนื้อหาไบนารีในตารางกริดพร้อมกับที่อยู่ และนำเสนอวิธีต่างๆ ในการตีความค่าพื้นฐาน เครื่องมือตรวจสอบหน่วยความจําจะแสดงข้อมูลต่อไปนี้ ตอนนี้เครื่องมือตรวจสอบหน่วยความจำช่วยให้คุณดูเนื้อหา ไปยังส่วนต่างๆ ของเนื้อหา และเลือกประเภทที่จะใช้ตีความค่าที่มีอยู่ได้ โดยจะแสดงค่า ASCII ข้างไบต์โดยตรง และอนุญาตให้ผู้ใช้เลือกรูปแบบการเรียงลำดับไบต์ที่แตกต่างกัน ดูการทำงานของเครื่องมือตรวจสอบหน่วยความจําได้ที่ด้านล่าง

หากอยากลองใช้ หากต้องการดูวิธีเปิดเครื่องมือตรวจสอบหน่วยความจำและดูบัฟเฟอร์อาร์เรย์ (หรือ TypedArray, DataView หรือหน่วยความจำ Wasm) และข้อมูลเพิ่มเติมเกี่ยวกับวิธีใช้ โปรดไปที่เอกสารประกอบเกี่ยวกับเครื่องมือตรวจสอบหน่วยความจำ ลองใช้กับตัวอย่างจำลองเหล่านี้ (สำหรับ JS, Wasm และ C++)

การออกแบบเครื่องมือตรวจสอบหน่วยความจำ

ในส่วนนี้ เราจะมาดูการออกแบบเครื่องมือตรวจสอบหน่วยความจำโดยใช้ Web Components และเราจะแสดงเป้าหมายการออกแบบอย่างหนึ่งที่เรามีและวิธีที่เรานำไปใช้งาน หากสงสัยและต้องการดูข้อมูลเพิ่มเติม โปรดดูเอกสารการออกแบบสำหรับเครื่องมือตรวจสอบหน่วยความจำ

คุณอาจเห็นบล็อกโพสต์เกี่ยวกับการย้ายข้อมูลไปยัง Web Components ซึ่ง Jack ได้เผยแพร่คู่มือภายในเกี่ยวกับวิธีสร้างคอมโพเนนต์ UI โดยใช้ Web Components การย้ายข้อมูลไปยัง Web Components เกิดขึ้นพร้อมกับที่เรากำลังทํางานเกี่ยวกับเครื่องมือตรวจสอบหน่วยความจํา เราจึงตัดสินใจลองใช้ระบบใหม่ ด้านล่างนี้คือแผนภาพที่แสดงคอมโพเนนต์ที่เราสร้างขึ้นเพื่อสร้างเครื่องมือตรวจสอบหน่วยความจำ (โปรดทราบว่าภายในเราเรียกเครื่องมือนี้ว่าเครื่องมือตรวจสอบหน่วยความจำแบบเชิงเส้น)

คอมโพเนนต์เว็บ

คอมโพเนนต์ LinearMemoryInspector เป็นคอมโพเนนต์หลักที่รวมคอมโพเนนต์ย่อยซึ่งสร้างองค์ประกอบทั้งหมดในเครื่องมือตรวจสอบหน่วยความจํา โดยพื้นฐานแล้ว จะใช้ Uint8Array และ address และเมื่อมีการเปลี่ยนแปลงรายการใดรายการหนึ่ง ระบบจะเผยแพร่ข้อมูลไปยังรายการย่อย ซึ่งจะทริกเกอร์ให้แสดงผลอีกครั้ง LinearMemoryInspector จะแสดงผลคอมโพเนนต์ย่อย 3 รายการ ได้แก่

  1. LinearMemoryViewer (แสดงค่า)
  2. LinearMemoryNavigator (อนุญาตการนําทาง) และ
  3. LinearMemoryValueInterpreter (แสดงการตีความข้อมูลพื้นฐานประเภทต่างๆ)

คอมโพเนนต์หลังเป็นคอมโพเนนต์หลักที่แสดงผล ValueInterpreterDisplay (แสดงค่า) และ ValueInterpreterSettings (เลือกประเภทที่จะแสดงในจอแสดงผล)

คอมโพเนนต์แต่ละรายการออกแบบมาเพื่อแสดงเฉพาะคอมโพเนนต์เล็กๆ ของ UI เท่านั้น เพื่อให้สามารถนำคอมโพเนนต์กลับมาใช้ซ้ำได้หากจำเป็น เมื่อใดก็ตามที่มีการตั้งค่าข้อมูลใหม่ในคอมโพเนนต์ ระบบจะเรียกใช้การแสดงผลอีกครั้ง ซึ่งจะแสดงการเปลี่ยนแปลงที่สะท้อนในข้อมูลที่ตั้งค่าไว้ในคอมโพเนนต์ ตัวอย่างเวิร์กโฟลว์ที่มีคอมโพเนนต์แสดงอยู่ด้านล่าง ซึ่งผู้ใช้กำลังเปลี่ยนที่อยู่ในแถบที่อยู่ ซึ่งจะทริกเกอร์การอัปเดตโดยการตั้งค่าข้อมูลใหม่ ในกรณีนี้คือที่อยู่ที่จะดู

แผนภาพคอมโพเนนต์

LinearMemoryInspector จะเพิ่มตัวเองเป็นผู้ฟังใน LinearMemoryNavigator ฟังก์ชัน addressChanged จะทริกเกอร์เมื่อมีเหตุการณ์ address-changed ทันทีที่ผู้ใช้แก้ไขอินพุตที่อยู่ ระบบจะส่งเหตุการณ์ดังกล่าวเพื่อให้เรียกใช้ฟังก์ชัน addressChanged ตอนนี้ฟังก์ชันนี้จะบันทึกที่อยู่ภายในและอัปเดตคอมโพเนนต์ย่อยโดยใช้ตัวตั้งค่า data(address, ..) คอมโพเนนต์ย่อยจะบันทึกที่อยู่ดังกล่าวไว้ในระบบและแสดงผลมุมมองอีกครั้งเพื่อแสดงเนื้อหาที่อยู่ที่เจาะจงนั้น

เป้าหมายการออกแบบ: ทำให้ประสิทธิภาพและการใช้หน่วยความจำไม่ขึ้นอยู่กับขนาดบัฟเฟอร์

สิ่งหนึ่งที่เราคำนึงถึงในระหว่างการออกแบบเครื่องมือตรวจสอบหน่วยความจำคือประสิทธิภาพของเครื่องมือนี้ไม่ควรขึ้นอยู่กับขนาดบัฟเฟอร์

ดังที่คุณได้เห็นในส่วนก่อนหน้านี้ คอมโพเนนต์ LinearMemoryInspector จะใช้ UInt8Array เพื่อแสดงผลค่า ในขณะเดียวกัน เราต้องการให้เครื่องมือตรวจสอบหน่วยความจําไม่ต้องเก็บข้อมูลทั้งหมดไว้ เนื่องจากเครื่องมือตรวจสอบหน่วยความจําจะแสดงเพียงบางส่วนเท่านั้น (เช่น หน่วยความจํา Wasm อาจมีขนาดใหญ่ถึง 4 GB และเราไม่ต้องการจัดเก็บ 4 GB ภายในเครื่องมือตรวจสอบหน่วยความจํา)

เราจึงอนุญาตให้คอมโพเนนต์ LinearMemoryInspector เก็บเฉพาะช่วงย่อยของบัฟเฟอร์เดิมเท่านั้น เพื่อให้มั่นใจว่าความเร็วและการใช้หน่วยความจำของเครื่องมือตรวจสอบหน่วยความจำจะไม่ขึ้นอยู่กับบัฟเฟอร์จริงที่เราแสดง

LinearMemoryInspector จะต้องรับอาร์กิวเมนต์อีก 2 รายการก่อน ซึ่งได้แก่ memoryOffset และ outerMemoryLength เพื่อให้การดําเนินการนี้ทํางาน memoryOffset ระบุออฟเซ็ตที่ Uint8Array ที่ส่งผ่านเริ่มต้น และจําเป็นต่อการแสดงผลที่อยู่ที่ถูกต้องของข้อมูล outerMemoryLength คือความยาวของบัฟเฟอร์เดิม และจําเป็นต่อการทำความเข้าใจช่วงที่เราแสดงได้

บัฟเฟอร์

ข้อมูลนี้ช่วยให้เรามั่นใจได้ว่ายังคงแสดงผลมุมมองเดิมได้ (เนื้อหารอบๆ address) โดยไม่ต้องมีข้อมูลทั้งหมด ดังนั้น จะทำอย่างไรหากมีการขอที่อยู่อื่นซึ่งอยู่ในช่วงอื่น ในกรณีนี้ LinearMemoryInspector จะทริกเกอร์ RequestMemoryEvent ซึ่งจะอัปเดตช่วงปัจจุบันที่จัดเก็บไว้ ตัวอย่างแสดงอยู่ด้านล่าง

แผนภาพเวิร์กโฟลว์ของทริกเกอร์เหตุการณ์

ในตัวอย่างนี้ ผู้ใช้ไปยังส่วนต่างๆ ในหน้าหน่วยความจํา (เครื่องมือตรวจสอบหน่วยความจําใช้การแบ่งหน้าเพื่อแสดงข้อมูลเป็นกลุ่มๆ) ซึ่งทริกเกอร์ PageNavigationEvent ซึ่งทริกเกอร์ RequestMemoryEvent เหตุการณ์ดังกล่าวจะเริ่มต้นการดึงข้อมูลช่วงใหม่ จากนั้นระบบจะนำไปเผยแพร่ไปยังคอมโพเนนต์ LinearMemoryInspector ผ่านการตั้งค่าข้อมูล เราจึงแสดงข้อมูลที่ดึงข้อมูลใหม่

และคุณทราบหรือไม่ คุณยังตรวจสอบหน่วยความจำในโค้ด Wasm และ C/C++ ได้ด้วย

เครื่องมือตรวจสอบหน่วยความจําไม่เพียงใช้ได้กับ ArrayBuffers ใน JavaScript เท่านั้น แต่ยังใช้ตรวจสอบหน่วยความจํา Wasm และหน่วยความจําที่การอ้างอิง/เคอร์เซอร์ C/C++ ชี้ไปได้ด้วย (โดยใช้ส่วนขยาย DWARF - ลองใช้เลยหากคุณยังไม่ได้ลอง ดูการแก้ไขข้อบกพร่อง WebAssembly ด้วยเครื่องมือสมัยใหม่ที่นี่ ภาพรวมสั้นๆ เกี่ยวกับเครื่องมือตรวจสอบหน่วยความจำที่ทำงานอยู่สำหรับการแก้ไขข้อบกพร่อง C++ บนเว็บ

ตรวจสอบหน่วยความจำใน C++

บทสรุป

บทความนี้แสดงเครื่องมือตรวจสอบหน่วยความจำและภาพตัวอย่างการออกแบบ เราหวังว่าเครื่องมือตรวจสอบหน่วยความจำจะช่วยให้คุณเข้าใจสิ่งที่เกิดขึ้นใน ArrayBuffer :-) หากมีคำแนะนำในการปรับปรุง โปรดแจ้งให้เราทราบและรายงานข้อบกพร่อง

ดาวน์โหลดแชแนลตัวอย่าง

ลองใช้ Chrome Canary, Dev หรือ เบต้า เป็นเบราว์เซอร์สำหรับนักพัฒนาซอฟต์แวร์เริ่มต้น ช่องทางเวอร์ชันตัวอย่างเหล่านี้จะช่วยให้คุณเข้าถึงฟีเจอร์ล่าสุดของ DevTools, ทดสอบ API ของแพลตฟอร์มเว็บที่ล้ำสมัย และช่วยค้นหาปัญหาในเว็บไซต์ของคุณก่อนที่ผู้ใช้จะพบ

ติดต่อทีมเครื่องมือสำหรับนักพัฒนาเว็บใน Chrome

ใช้ตัวเลือกต่อไปนี้เพื่อพูดคุยเกี่ยวกับฟีเจอร์ใหม่ การอัปเดต หรือสิ่งอื่นๆ ที่เกี่ยวข้องกับเครื่องมือสำหรับนักพัฒนาเว็บ