Latest web development tutorials

Lua แก้จุดบกพร่อง (Debug)

Lua ให้ห้องสมุดสำหรับการแก้ปัญหาให้เราสร้างฟังก์ชั่นแปลงที่กำหนดเอง Lua ตัวเองไม่ได้มีการสร้างขึ้นในราชการ แต่นักพัฒนาจำนวนมากร่วมกันว่าราชการรหัสของพวกเขา Lua

Lua ในห้องสมุดการแก้ปัญหารวมถึงฟังก์ชั่นดังต่อไปนี้:

sethook ([ด้าย] Hook, หน้ากาก [นับ]):
เลขที่ วิธีการและวัตถุประสงค์
1 การแก้ปัญหา ():

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

2 getfenv (Object):

ผลตอบแทนวัตถุตัวแปรสภาพแวดล้อม

3 gethook (ด้ายตัวเลือก):

ผลตอบแทนที่เป็นตัวแทนของสามชุดเบ็ดกระทู้: ฟังก์ชั่นในปัจจุบันตะขอเบ็ดหน้ากากปัจจุบันและนับเบ็ดปัจจุบัน

4 getinfo ([ด้าย] F [ สิ่ง]):

ข้อมูลเกี่ยวกับฟังก์ชั่นส่งกลับตาราง คุณสามารถให้ฟังก์ชั่นนี้คุณยังสามารถใช้เป็นตัวแทนดิจิตอลของฟังก์ชัน f ฟังก์ชั่นดิจิตอล F แสดงให้เห็นถึงการทำงานในหัวข้อที่ระบุเรียกกองสอดคล้องกับระดับ: ระดับ 0 แสดงฟังก์ชั่นปัจจุบัน (getinfo ตัวเอง); 1 ชั้นแสดงให้เห็นว่าฟังก์ชั่นการโทร getinfo (ยกเว้นว่าจะเป็นจุดสิ้นสุดของการโทรสถานการณ์เช่นนี้ไม่ได้รวมอยู่ในกอง); ฯลฯ . ถ้า F เป็นหน้าที่ของจำนวนกิจกรรมกว่าจำนวนขนาดใหญ่ getinfo ผลตอบแทนที่ศูนย์

5 debug.getlocal ([ด้าย] F, ท้องถิ่น):

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

6 getmetatable (บาท):

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

7 :: getRegistry ():

ตารางรีจิสทรีกลับซึ่งจะออกจากตารางที่กำหนดไว้ล่วงหน้าสามารถใช้ในการบันทึกรหัส C ใด ๆ ที่คุณต้องการที่จะประหยัดค่า Lua

8 getupvalue (F เพิ่มขึ้น)

ฟังก์ชั่นนี้จะส่งกลับชื่อและค่าของฟังก์ชั่น F คนแรกที่ขึ้นอยู่กับค่า ถ้ามันไม่ได้เกี่ยวกับค่าที่จะส่งกลับศูนย์
ใน '(' (วงเล็บเปิด) แทนชื่อตัวแปรเริ่มต้นด้วยการไม่มีชื่อตัวแปร (ยกเว้นการแก้ปัญหาข้อมูลรหัสบล็อก)

10 มันจะทำงานเป็นตะขอตั้งใน หน้ากากสตริงและนับดิจิตอลกำหนดเบ็ดจะถูกเรียกเมื่อ หน้ากากคือการรวมกันของตัวละครต่อไปนี้เป็นสตริงอักขระแต่ละตัวมีความหมายของมันเอง

  • ' c ': เมื่อใดก็ตาม Lua เรียกฟังก์ชันโทรเบ็ด;
  • ' r ': เวลา Lua กลับมาจากฟังก์ชั่นทุกคนจะเรียกเมื่อเบ็ด;
  • ' l ': ทุกครั้งที่เข้ามา Lua บรรทัดใหม่โทรเบ็ด
11 setlocal ([ด้าย] ระดับ ท้องถิ่นค่า):

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

12 setmetatable (ค่าตาราง):

ค่าของตารางองค์ประกอบชุด (สามารถไม่มี) ค่าตอบแทน

13 setupvalue (F, ขึ้น, ค่า) :

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

14 traceback ([ด้าย] [ข้อความ [ระดับ]]):

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

ตารางเป็นฟังก์ชั่นการแก้จุดบกพร่องของเราร่วมกันแล้วเราสามารถดูตัวอย่างง่ายๆ:

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 traceback:
	test2.lua:2: in function 'myfunction'
	test2.lua:8: in main chunk
	[C]: ?
table: 0054C6C8
Stack trace end

ในตัวอย่างที่เราใช้ traceback และ getinfo การแก้ปัญหาการทำงานห้องสมุดฟังก์ชัน 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

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


ประเภทการแก้จุดบกพร่อง

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

บรรทัดคำสั่งดีบักมี: RemDebug, clidebugger, ctrace, xdbLua, LuaInterface - ดีบัก Rldb, ModDebug

ดีบักอินเตอร์เฟซแบบกราฟิกที่มี: SciTE, Decoda, ZeroBrane สตูดิโอ, akdebugger, luaedit