English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
يقدم Lua مكتبة debug لتوفير إمكانية إنشاء م-debug مخصص. لا يحتوي Lua على debug مدمج، لكن العديد من المطورين تقاسموا كود debug الخاص بهم.
المكتبة debug في Lua تحتوي على الدوال التالية:
الرقم | الطريقة والغرض |
---|---|
1. | debug(): الانتقال إلى نمط التفاعل مع المستخدم، حيث يتم تشغيل كل سطر يدخل من المستخدم. باستخدام أوامر بسيطة وأي إعدادات تحقق أخرى، يمكن للمستخدم التحقق من المتغيرات العالمية والمحلية، تغيير قيم المتغيرات، حساب بعض التعبيرات، وما إلى ذلك. |
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 يحددان متى يتم استدعاء الم钩ة. الماسك هو نص من مجموعة من الأحرف، وكل حرف له معنى:
|
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.