0Pricing
Lua Academy · บทเรียน

ไลบรารี debug เชิงลึก

ใช้ debug.traceback, getinfo, getlocal และ getupvalue เพื่อตรวจสอบภายใน

ไลบรารี debug เชิงลึก เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน

ภาพรวมไลบรารี debug

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

เจาะลึก debug.getinfo

debug.getinfo(f, what) รับแฟล็ก what ดังนี้: "n" หมายถึงชื่อ, "S" หมายถึงแหล่งที่มา, "l" หมายถึงบรรทัดปัจจุบัน, "u" หมายถึงอัปแวลู และ "f" หมายถึงการอ้างอิงฟังก์ชัน

local function foo()
  local info = debug.getinfo(1, "nSlu")
  print(info.name)        -- foo
  print(info.short_src)   -- source file
  print(info.currentline) -- line number
  print(info.nups)        -- number of upvalues
end
foo()

การตรวจสอบตัวแปรเฉพาะที่

debug.getlocal(level, n) ส่งคืนชื่อและค่าของตัวแปรเฉพาะที่ลำดับที่ n ในระดับสแตกที่กำหนด ระดับ 1 หมายถึงฟังก์ชันปัจจุบัน

local function example()
  local x, y = 10, 20
  local i = 1
  while true do
    local name, val = debug.getlocal(1, i)
    if not name then break end
    print(name, val)
    i = i + 1
  end
end
example()  -- x 10 / y 20

การแก้ไขตัวแปรเฉพาะที่

debug.setlocal(level, n, value) เปลี่ยนค่าของตัวแปรเฉพาะที่ขณะทำงาน ซึ่งมีประโยชน์มากสำหรับการแก้จุดบกพร่องและการทดสอบ

การตรวจสอบอัปแวลู

debug.getupvalue(fn, n) ส่งคืนชื่อและค่าของอัปแวลูลำดับที่ n ของฟังก์ชัน ให้ทำซ้ำโดยเพิ่มค่า n จนกว่าจะส่งคืนค่า nil

local count = 0
local function inc() count = count + 1 end
print(debug.getupvalue(inc, 1))  -- count  0
debug.setupvalue(inc, 1, 99)
inc()
print(count)  -- 100

การไล่ดูสแตก

ไล่ดูสแตกการเรียกใช้ทั้งหมดโดยเพิ่มระดับทีละหนึ่ง จนกว่า debug.getinfo จะส่งคืนค่า nil

local function printStackTrace()
  local level = 1
  while true do
    local info = debug.getinfo(level, "Sln")
    if not info then break end
    print(level, info.short_src, info.currentline, info.name)
    level = level + 1
  end
end

debug.traceback

debug.traceback(msg, level) ส่งคืนสตริงร่องรอยสแตกที่จัดรูปแบบแล้ว เป็นฟังก์ชัน debug ที่ใช้งานได้จริงมากที่สุดสำหรับการจัดการข้อผิดพลาดในระบบจริง

การตรวจสอบโครูทีน

ส่งโครูทีนเป็นอาร์กิวเมนต์แรกให้กับ debug.getinfo เพื่อตรวจสอบสแตกของโครูทีนนั้น

local co = coroutine.create(function()
  print(debug.getinfo(1, "l").currentline)
end)
coroutine.resume(co)

debug.sethook สำหรับการติดตาม

ติดตามการเรียกใช้ฟังก์ชันทั้งหมดในโปรแกรมโดยตั้งฮุกการเรียกใช้ที่แสดงชื่อฟังก์ชัน

debug.sethook(function(event)
  if event == "call" then
    local info = debug.getinfo(2, "Sn")
    print("CALL:", info.name or "?")
  end
end, "c")

การยืนยันเงื่อนไขที่ใช้ได้หลายสภาพแวดล้อม

ใช้ debug.getinfo(2, "Sl") เพื่อเพิ่มข้อมูลไฟล์และบรรทัดลงในข้อผิดพลาดจากการยืนยันเงื่อนไข

local function assert2(cond, msg)
  if not cond then
    local info = debug.getinfo(2, "Sl")
    error(("[%s:%d] %s"):format(info.short_src, info.currentline, msg), 2)
  end
end

ข้อควรระวัง

ไลบรารี debug อาจละเมิดการห่อหุ้ม ทำให้โปรแกรมทำงานช้าลงอย่างมาก โดยเฉพาะเมื่อใช้ debug.sethook และอาจไม่มีให้ใช้ในทุกสภาพแวดล้อม ควรใช้เฉพาะระหว่างการพัฒนาและการทดสอบ

คำถามเกี่ยวกับไลบรารี debug

debug.getupvalue(fn, 1) ส่งคืนอะไร

สรุป: ไลบรารี debug โดยละเอียด

ไลบรารี debug มีความสามารถในการตรวจสอบสแตกด้วย getinfo การตรวจสอบและแก้ไขตัวแปรเฉพาะที่ด้วย getlocal/setlocal การเข้าถึงอัปแวลูด้วย getupvalue/setupvalue และการติดตามโดยใช้ฮุกด้วย sethook ควรใช้อย่างรับผิดชอบและใช้เฉพาะระหว่างการพัฒนา

คำถามที่พบบ่อย

บทเรียน “ไลบรารี debug เชิงลึก” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ไลบรารี debug เชิงลึก” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ไลบรารี debug เชิงลึก”

ใช้ debug.traceback, getinfo, getlocal และ getupvalue เพื่อตรวจสอบภายใน คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “ไลบรารี debug เชิงลึก” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม

ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ไลบรารี debug เชิงลึก
  2. การดีบักระยะไกลด้วย MobDebug
  3. การสร้างโพรไฟล์ด้วย LuaProfiler
  4. ความครอบคลุมโค้ดและการตรวจวัดการทดสอบ
← กลับไปที่ Lua Academy