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