Penyahpepijatan Lua (Nyahpepijat)


Lua menyediakan perpustakaan nyahpepijat untuk menyediakan fungsi mencipta gabenor tersuai kami. Lua sendiri tidak mempunyai gabenor terbina dalam, tetapi ramai pembangun telah berkongsi kod gabenor Lua mereka.

Pustaka nyahpepijat dalam Lua mengandungi fungsi berikut:

sethook ([benang,] cangkuk, topeng [, kiraan]):setlocal ([benang,] tahap, setempat, nilai): Fungsi ini memberikan nilai kepada pembolehubah setempat bagi fungsi tahap ke-pada tindanan. Jika tiada pembolehubah sedemikian, fungsi mengembalikan sifar. Jika tahap di luar batas, buang ralat. setmetatable (nilai, jadual): Tetapkan metatable nilai kepada jadual (boleh jadi nol ). Nilai pulangan. nilai persediaan (f, atas, nilai): Fungsi ini menetapkan nilai kepada fungsi f The up nilai. Jika fungsi tidak mempunyai nilai atas itu, ia mengembalikan sifar Jika tidak, ia mengembalikan nama nilai atas. surih balik ([benang,] [mesej [, tahap]]):Jika mesej mempunyai , dan bukan rentetan atau nil, fungsi mengembalikan mesej secara langsung tanpa sebarang pemprosesan. Jika tidak, ia mengembalikan maklumat surih balik tindanan bagi timbunan panggilan. Mesej rentetan pilihan dilampirkan pada permulaan surih balik tindanan. Tahap pilihan berangka menentukan pada tahap mana timbunan untuk mula menjejak kembali (lalai kepada 1 , di mana jejak balik dipanggil). Laksanakan output kod di atas. hasilnya ialah:
Stack trace
stack traceback:
	test2.lua:2: in function 'myfunction'
	test2.lua:8: in main chunk
	[C]: ?
table: 0054C6C8
Stack trace end
Dalam contoh di atas, kami menggunakan fungsi surih balik dan getinfo pustaka nyahpepijat Fungsi getinfo digunakan untuk mengembalikan jadual maklumat fungsi.
Nombor siriKaedah & Tujuan
1.debug():

Masukkan interaksi pengguna mod dan jalankan Setiap rentetan yang dimasukkan oleh pengguna. Menggunakan arahan mudah dan tetapan penyahpepijatan lain, pengguna boleh memeriksa pembolehubah global dan tempatan, menukar nilai pembolehubah, menilai beberapa ungkapan dan banyak lagi.
Memasukkan baris yang mengandungi hanya samb akan menamatkan fungsi, membolehkan pemanggil meneruskan.

2.getfenv(objek):

Mengembalikan pembolehubah persekitaran objek.

3.gethook(benang pilihan):

Mengembalikan tiga nilai yang mewakili tetapan cangkuk benang: Cangkuk semasa Fungsi, topeng cangkuk semasa, kiraan cangkuk semasa

4.getinfo ([benang,] f [, apa]):

Mengembalikan jadual maklumat tentang fungsi. Anda boleh menyediakan fungsi secara langsung, atau anda boleh menggunakan nombor f untuk mewakili fungsi tersebut. Nombor f mewakili fungsi yang berjalan pada tahap yang sepadan bagi timbunan panggilan bagi utas yang ditentukan: Tahap 0 mewakili fungsi semasa (getinfo itu sendiri); ia tidak dikira pada timbunan); Jika f ialah nombor yang lebih besar daripada bilangan fungsi aktif, getinfo mengembalikan sifar.

5.debug.getlocal ([thread,] f, local):

Fungsi ini kembali pada tindanan Indeks fungsi pada tahap f ialah nama dan nilai tempatan pembolehubah tempatan. Fungsi ini bukan sahaja digunakan untuk mengakses pembolehubah tempatan yang ditakrifkan secara eksplisit, tetapi juga termasuk parameter formal, pembolehubah sementara, dsb.

6.getmetatable(value):

Tolak metatable bagi nilai yang ditunjukkan oleh indeks yang diberikan ke timbunan itu. Jika indeks tidak sah, atau tiada metatable untuk nilai, fungsi mengembalikan 0 dan tidak menolak apa-apa ke tindanan.

7.getregistry():

Mengembalikan jadual pendaftaran, yang merupakan jadual yang telah ditetapkan untuk menyimpan sebarang nilai Lua yang ingin disimpan oleh kod C.

8.nilai perolehan (f, atas)

Fungsi ini mengembalikan nilai atas ke atas bagi fungsi f nama dan nilai. Jika fungsi tidak mempunyai nilai atas itu, nil dikembalikan.
Nama pembolehubah yang bermula dengan '(' (kurungan terbuka) mewakili pembolehubah tanpa nama (blok kod dengan maklumat nyahpepijat dialih keluar).

10. Masukkan fungsi sebagai fungsi cangkuk. Topeng rentetan dan kiraan nombor menentukan bila cangkuk itu dipanggil >


    '
  • ':

    Setiap kali Lua memanggil fungsi, panggil cangkuk

  • 'r': Setiap kali Lua kembali dari fungsi, panggil cangkuk; >':

    Cangkuk dipanggil setiap kali Lua memasuki baris baharu.
  • l

    11.
12.

13.

14.

Jadual di atas menyenaraikan fungsi penyahpepijatan yang biasa kita gunakan Seterusnya kita boleh melihat beberapa contoh mudah:

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

Contoh lain

Kami selalunya perlu menyahpepijat pembolehubah setempat dalam fungsi. Kita boleh menggunakan fungsi getupvalue untuk menetapkan pembolehubah tempatan ini. Contohnya adalah seperti berikut:

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

Hasil keluaran melaksanakan kod di atas ialah:

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

Dalam contoh di atas, pembilang akan meningkat sebanyak 1 setiap kali ia dipanggil. Dalam contoh, kami menggunakan fungsi getupvalue untuk melihat status semasa pembolehubah tempatan. Kita boleh menetapkan pembolehubah tempatan kepada nilai baharu. Dalam contoh, nilai n sebelum tetapan ialah 2, dan fungsi nilai persediaan digunakan untuk menetapkannya kepada 10. Sekarang kita memanggil fungsi dan output selepas pelaksanaan ialah 11 dan bukannya 3.

Jenis nyahpepijat

Penyahpepijatan baris perintah

    Penyahpepijatan antara muka grafik
  • Penyahpepijat baris perintah termasuk: RemDebug, clidebugger, ctrace, xdbLua, LuaInterface - Debugger, Rldb, ModDebug.
  • Penyahpepijat dalam dunia grafik termasuk: SciTE, Decoda, ZeroBrane Studio, akdebugger dan luaedit.