Lua - Gỡ lỗi

Lua cung cấp một thư viện gỡ lỗi, cung cấp tất cả các chức năng nguyên thủy để chúng ta tạo trình gỡ lỗi của riêng mình. Mặc dù không có trình gỡ lỗi Lua tích hợp sẵn, chúng tôi có nhiều trình gỡ lỗi cho Lua, được tạo bởi nhiều nhà phát triển khác nhau với nhiều người là mã nguồn mở.

Các hàm có sẵn trong thư viện gỡ lỗi Lua được liệt kê trong bảng sau cùng với cách sử dụng của nó.

Sr.No. Phương pháp & Mục đích
1

debug()

Vào chế độ tương tác để gỡ lỗi, chế độ này vẫn hoạt động cho đến khi chúng tôi nhập chỉ cont trong một dòng và nhấn enter. Người dùng có thể kiểm tra các biến trong chế độ này bằng các hàm khác.

2

getfenv(object)

Trả về môi trường của đối tượng.

3

gethook(optional thread)

Trả về cài đặt móc hiện tại của luồng, dưới dạng ba giá trị - chức năng móc hiện tại, mặt nạ móc hiện tại và số móc hiện tại.

4

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

Trả về một bảng với thông tin về một hàm. Bạn có thể cung cấp hàm trực tiếp hoặc bạn có thể cung cấp một số làm giá trị của hàm, có nghĩa là hàm đang chạy ở hàm cấp của ngăn xếp cuộc gọi của luồng đã cho - cấp 0 là hàm hiện tại (chính là getinfo); mức 1 là chức năng được gọi là getinfo; và như thế. Nếu hàm là một số lớn hơn số hàm đang hoạt động, thì getinfo trả về nil.

5

getlocal(optional thread, stack level, local index)

Trả về tên và giá trị của biến cục bộ với chỉ mục cục bộ của hàm ở cấp độ ngăn xếp. Trả về nil nếu không có biến cục bộ nào với chỉ mục đã cho và phát sinh lỗi khi được gọi với cấp nằm ngoài phạm vi.

6

getmetatable(value)

Trả về khả năng gặp của đối tượng hoặc nil đã cho nếu đối tượng đó không có đối tượng có thể đo được.

7

getregistry()

Trả về bảng đăng ký, một bảng được xác định trước có thể được sử dụng bởi bất kỳ mã C nào để lưu trữ bất kỳ giá trị Lua nào mà nó cần để lưu trữ.

số 8

getupvalue(function, upvalue index)

Hàm này trả về tên và giá trị của giá trị tăng cùng với chỉ mục của hàm func. Hàm trả về nil nếu không có giá trị tăng với chỉ số đã cho.

9

setfenv(function or thread or userdata, environment table)

Đặt môi trường của đối tượng đã cho vào bảng đã cho. Trả về đối tượng.

10

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

Đặt hàm đã cho dưới dạng móc câu. Mặt nạ chuỗi và số đếm mô tả khi nào hook sẽ được gọi. Ở đây, c, r và l được gọi mỗi khi Lua gọi, trả về và nhập mọi dòng mã trong một hàm tương ứng.

11

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

Gán giá trị cho biến cục bộ với chỉ mục cục bộ của hàm ở cấp ngăn xếp. Hàm trả về nil nếu không có biến cục bộ với chỉ số đã cho và gây ra lỗi khi được gọi với mức nằm ngoài phạm vi. Nếu không, nó trả về tên của biến cục bộ.

12

setmetatable(value, metatable)

Đặt khả năng đáp ứng cho đối tượng đã cho vào bảng đã cho (có thể là số không).

13

setupvalue(function, upvalue index, value)

Hàm này gán giá trị cho giá trị tăng với chỉ mục lên của hàm func. Hàm trả về nil nếu không có giá trị tăng với chỉ số đã cho. Nếu không, nó trả về tên của giá trị tăng.

14

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

Tạo một thông báo lỗi mở rộng với một dấu vết.

Danh sách trên là danh sách đầy đủ các hàm gỡ lỗi trong Lua và chúng tôi thường sử dụng một thư viện sử dụng các hàm trên và cung cấp việc gỡ lỗi dễ dàng hơn. Việc sử dụng các chức năng này và tạo trình gỡ lỗi của riêng chúng tôi khá phức tạp và không được ưa chuộng. Dù sao, chúng ta sẽ thấy một ví dụ về việc sử dụng đơn giản các hàm gỡ lỗi.

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

   return 10
end

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

Khi chúng ta chạy chương trình trên, chúng ta sẽ nhận được dấu vết ngăn xếp như hình dưới đây.

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

Trong chương trình mẫu trên, dấu vết ngăn xếp được in bằng cách sử dụng hàm debug.trace có sẵn trong thư viện gỡ lỗi. Debug.getinfo lấy bảng hiện tại của hàm.

Gỡ lỗi - Ví dụ

Chúng ta thường cần biết các biến cục bộ của một hàm để gỡ lỗi. Với mục đích đó, chúng ta có thể sử dụng getupvalue và để đặt các biến cục bộ này, chúng ta sử dụng setupvalue. Một ví dụ đơn giản cho điều này được hiển thị bên dưới.

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())

Khi chúng ta chạy chương trình trên, chúng ta sẽ nhận được kết quả sau.

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

Trong ví dụ này, bộ đếm cập nhật từng cái một khi nó được gọi. Chúng ta có thể thấy trạng thái hiện tại của biến cục bộ bằng cách sử dụng hàm getupvalue. Sau đó, chúng tôi đặt biến cục bộ thành một giá trị mới. Ở đây, n là 2 trước khi hoạt động tập hợp được gọi. Sử dụng hàm setupvalue, nó được cập nhật lên 10. Bây giờ khi chúng ta gọi hàm counter, nó sẽ trả về 11 thay vì 3.

Các loại gỡ lỗi

  • Gỡ lỗi dòng lệnh
  • Gỡ lỗi đồ họa

Gỡ lỗi dòng lệnh

Gỡ lỗi dòng lệnh là loại gỡ lỗi sử dụng dòng lệnh để gỡ lỗi với sự trợ giúp của các lệnh và câu lệnh in. Có rất nhiều trình gỡ lỗi dòng lệnh có sẵn cho Lua, trong đó có một số trình gỡ rối được liệt kê bên dưới.

  • RemDebug- RemDebug là trình gỡ lỗi từ xa cho Lua 5.0 và 5.1. Nó cho phép bạn kiểm soát việc thực thi một chương trình Lua khác từ xa, thiết lập các điểm ngắt và kiểm tra trạng thái hiện tại của chương trình. RemDebug cũng có thể gỡ lỗi các tập lệnh CGILua.

  • clidebugger- Trình gỡ lỗi giao diện dòng lệnh đơn giản cho Lua 5.1 được viết bằng Lua thuần túy. Nó không phụ thuộc vào bất kỳ thứ gì khác ngoài các thư viện Lua 5.1 tiêu chuẩn. Nó được lấy cảm hứng từ RemDebug nhưng không có cơ sở vật chất từ ​​xa.

  • ctrace - Một công cụ để theo dõi các lệnh gọi Lua API.

  • xdbLua - Trình gỡ lỗi dòng lệnh Lua đơn giản cho nền tảng Windows.

  • LuaInterface - Debugger- Dự án này là một phần mở rộng trình gỡ lỗi cho LuaInterface. Nó nâng giao diện gỡ lỗi được xây dựng trong Lua lên một cấp độ cao hơn. Tương tác với trình gỡ lỗi được thực hiện bởi các sự kiện và lời gọi phương thức.

  • Rldb- Đây là trình gỡ lỗi Lua từ xa thông qua socket, có sẵn trên cả Windows và Linux. Nó có thể cung cấp cho bạn nhiều tính năng hơn bất kỳ tính năng nào hiện có.

  • ModDebug - Điều này cho phép điều khiển việc thực thi một chương trình Lua khác từ xa, thiết lập các điểm ngắt và kiểm tra trạng thái hiện tại của chương trình.

Gỡ lỗi đồ họa

Gỡ lỗi đồ họa có sẵn với sự trợ giúp của IDE nơi bạn được cung cấp gỡ lỗi trực quan về các trạng thái khác nhau như giá trị biến, dấu vết ngăn xếp và thông tin liên quan khác. Có một biểu diễn trực quan và kiểm soát từng bước việc thực thi với sự trợ giúp của các điểm ngắt, bước vào, bước qua và các nút khác trong IDE.

Có một số trình gỡ lỗi đồ họa cho Lua và nó bao gồm những điều sau đây.

  • SciTE - Windows IDE mặc định cho Lua cung cấp nhiều tiện ích gỡ lỗi như điểm ngắt, bước, bước vào, bước qua, xem các biến, v.v.

  • Decoda - Đây là một trình gỡ lỗi đồ họa với hỗ trợ gỡ lỗi từ xa.

  • ZeroBrane Studio- Lua IDE với trình gỡ lỗi từ xa tích hợp, chế độ xem ngăn xếp, chế độ xem đồng hồ, bảng điều khiển từ xa, bộ phân tích tĩnh và hơn thế nữa. Hoạt động với LuaJIT, Love2d, Moai và các động cơ Lua khác; Windows, OSX và Linux. Mã nguồn mở.

  • akdebugger - Trình gỡ lỗi và trình chỉnh sửa Lua plugin cho Eclipse.

  • luaedit - Tính năng này có tính năng gỡ lỗi từ xa, gỡ lỗi cục bộ, đánh dấu cú pháp, danh sách đề xuất hoàn thành, công cụ đề xuất tham số, quản lý điểm ngắt trước (bao gồm hệ thống điều kiện trên điểm ngắt và số lần truy cập), danh sách chức năng, danh sách biến toàn cục và cục bộ, đồng hồ, quản lý theo hướng giải pháp.