English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

التحقق من الأخطاء (Debug) في Lua

يقدم Lua مكتبة debug لتوفير إمكانية إنشاء م-debug مخصص. لا يحتوي Lua على debug مدمج، لكن العديد من المطورين تقاسموا كود debug الخاص بهم.

المكتبة debug في Lua تحتوي على الدوال التالية:

الرقمالطريقة والغرض
1.debug():

الانتقال إلى نمط التفاعل مع المستخدم، حيث يتم تشغيل كل سطر يدخل من المستخدم. باستخدام أوامر بسيطة وأي إعدادات تحقق أخرى، يمكن للمستخدم التحقق من المتغيرات العالمية والمحلية، تغيير قيم المتغيرات، حساب بعض التعبيرات، وما إلى ذلك.
إدخال سطر يحتوي فقط على نص 'cont' ينتهي بهذا الدالة، مما يسمح للمستدعي بالاستمرار في التنفيذ.

2.getfenv(object):

يعود هذا الدالة بيئة الدالة.

3.gethook(optional thread):

يعود هذا الدالة بثلاثة قيم تمثل إعدادات الم钩ة للسطر الحالي: الدالة الم钩ة الحالية، الماسك الم钩ة الحالي، والعدد الم钩ة الحالي

4.getinfo ([thread,] f [, what]):

يعود هذا الدالة بجدول يحتوي على معلومات حول الدالة. يمكنك تقديم الدالة مباشرة، أو استخدام عدد f لتمثيل الدالة. يمثل الرقم f الدالة في الطبقة المحددة من قائمة الدعوات في السطر الحالي: الطبقة 0 تمثل الدالة الحالية (getinfo نفسها);الطبقة 1 تمثل الدالة التي يتم استدعاء getinfo منها (ما عدا الاستدعاءات النهائية، التي لا يتم احتسابها في السطر الحالي);إلخ. إذا كان f عددًا أكبر من عدد الدعوات النشطة، يعود getinfo nil.

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

يعود هذا الدالة باسم و القيمة للمتغيرات المحلية في مستوى f من الدالة على الدالة. تستخدم هذه الدالة ليس فقط لتحديد المتغيرات المحلية المحددة، بل أيضًا للمتغيرات الشكلية، المتغيرات المؤقتة، وما إلى ذلك.

6.getmetatable(value):

يضغط جدول المetas لقيمة يشير إليها المؤشر المحدد. إذا كان المؤشر غير صالح، أو إذا لم يكن لدى القيمة جدول meta، يعود الدالة 0 ولا يضغط أي شيء على الدالة.

7.getregistry():

يعود هذا الدالة بجدول التسجيل، وهو جدول مسبق التحديد يمكن استخدامه لتحفظ أي قيمة يريد C حفظها في Lua.

8.getupvalue (f, up)

يعود هذا الدالة باسم و القيمة للقيمة العليا up لدالة f. إذا لم تكن هناك تلك القيمة العليا في الدالة، يعود nil.
اسم المتغير الذي يبدأ بـ '(' (المفتاح المفتوح) يمثل متغيراً بدون اسم (يتم إزالة كود المعلومات المتعلقة بالتحقق من الخطأ).

10.sethook ([thread,] hook, mask [, count]):

تضيف دالة كـ دالة م钩ة. النص mask وعدد count يحددان متى يتم استدعاء الم钩ة. الماسك هو نص من مجموعة من الأحرف، وكل حرف له معنى:

  • 'c': عندما يستدعي Lua دالة، يتم استدعاء الم钩ة;

  • 'r': عندما يعود Lua من داخل دالة، يتم استدعاء الم钩ة;

  • 'l': تُدعى الدالة الموجهة كلما دخل Lua إلى سطر جديد.

11.setlocal ([thread,] level, local, value):

تقوم بإعداد value لتكون المتغير المحلي للوظيفة في الطبقة level من السكوب. إذا لم يكن هناك ذلك المتغير، تقوم الوظيفة بالعودة إلى nil. إذا كانت الطبقة level غير محددة، تقوم الوظيفة بطرح خطأ.

12.setmetatable (value, table):

تقوم بإعداد جدول الميتا لـ value إلى table (يمكن أن يكون nil). تقوم بالعودة إلى value.

13.setupvalue (f, up, value):

هذه الوظيفة تقوم بإعداد value لتكون القيمة العليا السابقة للوظيفة f. إذا لم يكن هناك تلك القيمة العليا، تقوم بالعودة إلى nil، وإلا تقوم بالعودة إلى اسم القيمة العليا.

14.traceback ([thread,] [message [, level]]):

إذا كان message موجودًا وليس نصًا أو nil، فإن الوظيفة لا تقوم بأي معالجة وتقوم بالعودة إلى message مباشرة. وإلا، تقوم بالعودة إلى معلومات استدعاء السكوب. يمكن إضافة الخيار النصي message في بداية معلومات استدعاء السكوب. يمكن للرقم الخياري level أن يحدد من طبقة السكوب التي تبدأ العودة (الافتراض هو 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

في هذا المثال، استخدمنا مكتبة debug ووظائف 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

في المثال أعلاه، يزيد العددين في كل مرة يتم فيها استدعاء النص. في المثال، استخدمنا وظيفة getupvalue لمراقبة حالة المتغيرات المحلية الحالية. يمكننا تعيين المتغيرات المحلية إلى قيم جديدة. في المثال، قبل تعيين n إلى 2، استخدمنا وظيفة setupvalue لتعيينها إلى 10. الآن، عند استدعاء الوظيفة، سيكون الناتج 11 وليس 3.

نوع التحقق

  • مصادقة السطر

  • مصادقة الشاشة المرئية

مصادقة السطر تشمل: RemDebug، clidebugger، ctrace، xdbLua، LuaInterface - Debugger، Rldb، ModDebug.

مصادقة الشاشة المرئية تشمل: SciTE، Decoda، ZeroBrane Studio، akdebugger، luaedit.