Lua - การแก้จุดบกพร่อง

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

ฟังก์ชันที่มีอยู่ในไลบรารีการดีบัก Lua แสดงอยู่ในตารางต่อไปนี้พร้อมกับการใช้งาน

ซีเนียร์ วิธีการและวัตถุประสงค์
1

debug()

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

2

getfenv(object)

ส่งคืนสภาพแวดล้อมของวัตถุ

3

gethook(optional thread)

ส่งคืนการตั้งค่าตะขอปัจจุบันของเธรดเป็นค่าสามค่า - ฟังก์ชันเบ็ดปัจจุบันหน้ากากขอปัจจุบันและจำนวนเบ็ดปัจจุบัน

4

getinfo(optional thread, function or stack level, optional flag)

ส่งคืนตารางที่มีข้อมูลเกี่ยวกับฟังก์ชัน คุณสามารถให้ฟังก์ชันโดยตรงหรือคุณสามารถให้ตัวเลขเป็นค่าของฟังก์ชันซึ่งหมายถึงฟังก์ชันที่ทำงานที่ฟังก์ชันระดับของ call stack ของเธรดที่กำหนด - ระดับ 0 คือฟังก์ชันปัจจุบัน (getinfo เอง) ระดับ 1 คือฟังก์ชันที่เรียกว่า getinfo และอื่น ๆ ถ้าฟังก์ชันเป็นตัวเลขที่มากกว่าจำนวนฟังก์ชันที่ใช้งานอยู่ getinfo จะส่งกลับค่า nil

5

getlocal(optional thread, stack level, local index)

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

6

getmetatable(value)

ส่งคืน metatable ของวัตถุที่กำหนดหรือศูนย์หากไม่มี metatable

7

getregistry()

ส่งคืนตารางรีจิสทรีซึ่งเป็นตารางที่กำหนดไว้ล่วงหน้าซึ่งสามารถใช้โดยรหัส C ใดก็ได้เพื่อเก็บค่า Lua ที่ต้องการจัดเก็บ

8

getupvalue(function, upvalue index)

ฟังก์ชันนี้จะส่งคืนชื่อและค่าของค่าที่เพิ่มขึ้นพร้อมดัชนีขึ้นของฟังก์ชันฟังก์ชัน ฟังก์ชันจะคืนค่าศูนย์หากไม่มีค่าดัชนีที่กำหนด

9

setfenv(function or thread or userdata, environment table)

ตั้งค่าสภาพแวดล้อมของวัตถุที่กำหนดให้กับตารางที่กำหนด ส่งคืนวัตถุ

10

sethook(optional thread, hook function, hook mask string with "c" and/or "r" and/or "l", optional instruction count)

ตั้งค่าฟังก์ชันที่กำหนดเป็นตะขอ มาสก์สตริงและการนับจำนวนอธิบายว่าเมื่อใดที่จะเรียกเบ็ด ที่นี่ c, r และ l ถูกเรียกทุกครั้งที่ Lua เรียกส่งกลับและป้อนรหัสทุกบรรทัดในฟังก์ชันตามลำดับ

11

setlocal(optional thread, stack level, local index, value)

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

12

setmetatable(value, metatable)

ตั้งค่า metatable สำหรับวัตถุที่กำหนดให้กับตารางที่กำหนด (ซึ่งอาจเป็นศูนย์)

13

setupvalue(function, upvalue index, value)

ฟังก์ชันนี้จะกำหนดค่าให้กับค่าที่เพิ่มขึ้นด้วยดัชนีของฟังก์ชัน func ฟังก์ชันจะคืนค่าศูนย์หากไม่มีค่าดัชนีที่กำหนด มิฉะนั้นจะส่งคืนชื่อของค่าที่เพิ่มขึ้น

14

traceback(optional thread, optional message string, optional level argument)

สร้างข้อความแสดงข้อผิดพลาดเพิ่มเติมพร้อมการย้อนกลับ

รายการด้านบนเป็นรายการฟังก์ชันดีบักทั้งหมดใน Lua และเรามักใช้ไลบรารีที่ใช้ฟังก์ชันข้างต้นและให้การดีบักที่ง่ายขึ้น การใช้ฟังก์ชันเหล่านี้และการสร้างดีบักเกอร์ของเราเองนั้นค่อนข้างซับซ้อนและไม่เป็นที่ต้องการ อย่างไรก็ตามเราจะเห็นตัวอย่างการใช้ฟังก์ชันการดีบักอย่างง่าย

function myfunction ()
   print(debug.traceback("Stack trace"))
   print(debug.getinfo(1))
   print("Stack trace end")

   return 10
end

myfunction ()
print(debug.getinfo(1))

เมื่อเรารันโปรแกรมด้านบนเราจะได้ stack trace ดังภาพด้านล่าง

Stack trace
stack traceback:
	test2.lua:2: in function 'myfunction'
	test2.lua:8: in main chunk
	[C]: ?
table: 0054C6C8
Stack trace end

ในโปรแกรมตัวอย่างข้างต้นการติดตามสแต็กจะถูกพิมพ์โดยใช้ฟังก์ชัน debug.trace ที่มีอยู่ในไลบรารีดีบัก debug.getinfo รับตารางปัจจุบันของฟังก์ชัน

การแก้จุดบกพร่อง - ตัวอย่าง

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

function newCounter ()
   local n = 0
   local k = 0
	
   return function ()
      k = n
      n = n + 1
      return n
   end
	
end

counter = newCounter ()

print(counter())
print(counter())

local i = 1

repeat
   name, val = debug.getupvalue(counter, i)
	
   if name then
      print ("index", i, name, "=", val)
		
      if(name == "n") then
         debug.setupvalue (counter,2,10)
      end
		
      i = i + 1
   end -- if
	
until not name

print(counter())

เมื่อเรารันโปรแกรมข้างต้นเราจะได้ผลลัพธ์ดังต่อไปนี้

1
2
index	1	k	=	1
index	2	n	=	2
11

ในตัวอย่างนี้ตัวนับจะอัปเดตทีละครั้งทุกครั้งที่มีการเรียกใช้ เราสามารถดูสถานะปัจจุบันของตัวแปรท้องถิ่นโดยใช้ฟังก์ชัน getupvalue จากนั้นเราตั้งค่าตัวแปรภายในเป็นค่าใหม่ ในที่นี้ n คือ 2 ก่อนที่จะเรียกการดำเนินการชุด เมื่อใช้ฟังก์ชัน setupvalue จะอัปเดตเป็น 10 แล้วเมื่อเราเรียกใช้ฟังก์ชันตัวนับจะส่งกลับ 11 แทนที่จะเป็น 3

ประเภทการดีบัก

  • การดีบักบรรทัดคำสั่ง
  • การดีบักแบบกราฟิก

การแก้จุดบกพร่องของบรรทัดคำสั่ง

การดีบักบรรทัดคำสั่งคือประเภทของการดีบักที่ใช้บรรทัดคำสั่งเพื่อดีบักด้วยความช่วยเหลือของคำสั่งและคำสั่งพิมพ์ มีดีบักเกอร์บรรทัดคำสั่งมากมายสำหรับ Lua ซึ่งมีอยู่สองสามรายการด้านล่าง

  • RemDebug- RemDebug เป็นตัวดีบักระยะไกลสำหรับ Lua 5.0 และ 5.1 ช่วยให้คุณควบคุมการทำงานของโปรแกรม Lua อื่นจากระยะไกลตั้งค่าจุดพักและตรวจสอบสถานะปัจจุบันของโปรแกรม RemDebug ยังสามารถดีบักสคริปต์ CGILua

  • clidebugger- ดีบักเกอร์อินเทอร์เฟซบรรทัดคำสั่งอย่างง่ายสำหรับ Lua 5.1 ที่เขียนด้วย Lua บริสุทธิ์ ไม่ได้ขึ้นอยู่กับสิ่งอื่นใดนอกจากไลบรารี Lua 5.1 มาตรฐาน ได้รับแรงบันดาลใจจาก RemDebug แต่ไม่มีสิ่งอำนวยความสะดวกระยะไกล

  • ctrace - เครื่องมือสำหรับติดตามการเรียก Lua API

  • xdbLua - ดีบักเกอร์บรรทัดคำสั่ง Lua อย่างง่ายสำหรับแพลตฟอร์ม Windows

  • LuaInterface - Debugger- โปรเจ็กต์นี้เป็นส่วนขยายดีบักเกอร์สำหรับ LuaInterface มันยกอินเทอร์เฟซการดีบัก Lua ในตัวไปสู่ระดับที่สูงขึ้น การโต้ตอบกับดีบักเกอร์ทำได้โดยการเรียกใช้เหตุการณ์และเมธอด

  • Rldb- นี่คือดีบักเกอร์ Lua ระยะไกลผ่านซ็อกเก็ตซึ่งมีให้ทั้งบน Windows และ Linux มันสามารถให้คุณสมบัติมากกว่าที่มีอยู่

  • ModDebug - สิ่งนี้ช่วยในการควบคุมการทำงานของโปรแกรม Lua อื่นจากระยะไกลตั้งค่าจุดพักและตรวจสอบสถานะปัจจุบันของโปรแกรม

การแก้จุดบกพร่องแบบกราฟิก

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

มีตัวดีบักแบบกราฟิกจำนวนมากสำหรับ Lua และรวมถึงสิ่งต่อไปนี้

  • SciTE - Windows IDE เริ่มต้นสำหรับ Lua มีสิ่งอำนวยความสะดวกในการแก้ไขจุดบกพร่องหลายอย่างเช่นเบรกพอยต์ขั้นตอนก้าวเข้าก้าวข้ามตัวแปรเฝ้าดูและอื่น ๆ

  • Decoda - นี่คือโปรแกรมแก้ไขจุดบกพร่องแบบกราฟิกที่รองรับการดีบักระยะไกล

  • ZeroBrane Studio- Lua IDE พร้อมตัวดีบั๊กระยะไกลในตัวมุมมองสแต็กมุมมองนาฬิกาคอนโซลระยะไกลตัววิเคราะห์แบบคงที่และอื่น ๆ ทำงานร่วมกับ LuaJIT, Love2d, Moai และเครื่องยนต์ Lua อื่น ๆ Windows, OSX และ Linux โอเพ่นซอร์ส.

  • akdebugger - ดีบักเกอร์และตัวแก้ไขปลั๊กอิน Lua สำหรับ Eclipse

  • luaedit - คุณสมบัตินี้มีการดีบักระยะไกลการดีบักในพื้นที่การเน้นไวยากรณ์รายการข้อเสนอที่สมบูรณ์เอ็นจินการเสนอพารามิเตอร์การจัดการเบรกพอยต์ล่วงหน้า (รวมถึงระบบเงื่อนไขในจุดพักและจำนวนการตี) รายการฟังก์ชันการแสดงรายการตัวแปรทั่วโลกและในพื้นที่นาฬิกาการจัดการที่มุ่งเน้นโซลูชัน