FreeKill/docs/diy/08-debugging.rst

76 lines
2.7 KiB
ReStructuredText
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

.. SPDX-License-Identifier: GFDL-1.3-or-later
技巧:调试您的代码
==================
Lua是一门很不错的语言。然而其在调试上却稍有困难。网上或许能找到一些针对独立运行的Lua脚本的调试器例如vscode能下载的到的各种Lua debugger但却不适用于FK。
因此本文将试图为你扫清Lua调试方面的障碍。
假设你正使用Windows系统那么启动FK的时候应该是一个游戏窗口+一个黑色的命令行窗口。调试工作基本就是在黑色窗口进行的。
使用debugger.lua
----------------
这应该是最为推荐的一种做法了FreeKill在lib中引用了debugger.lua作为调试库。
以下只简要介绍一下用法,最详细的详情请去项目官网查看: https://github.com/slembcke/debugger.lua
当你想要在代码中下断点时,就调用 ``dbg()`` 函数。当执行到这里时就会停下来并在命令行中显示类似gdb的界面。
例如:
.. code:: lua
local room = player.room
dbg() -- 相当于下了断点,后面就可以来此进行调试
player:drawCards(1)
上面的代码中就调用了debugger.lua让程序进行了中断然后命令行就进入了调试界面。
.. hint::
在默认的双击启用exe带有的命令行中颜色可能会显示的非常奇怪。
如果你遇到了颜色不能正常显示的问题推荐你使用Git Bash或者Windows Terminal之类的终端模拟器然后在命令行中通过FreeKill.exe来启动游戏。
下面来说说调试的基本用法:使用 ``h`` 命令显示帮助信息。debugger.lua已经被我中文化了。
.. tip::
其实也可以用lua自带的 ``debug.debug()`` 进行交互式调试不过功能比debugger.lua弱得多了。
.. warning::
在Linux上使用FreeKill -s开服时不能用这个调试器因为stdin已经被服务端shell占用了所以无法调试。
一些在调试中可能有用的函数
--------------------------
在调试器中直接输入Lua语句就能执行。以下是一些可能用得到的函数
print
~~~~~
遇事不决print这是当时没有调试器可用时候的措施。简单但却实用。
现在可以直接用debugger.lua的 p 命令输出表达式的值了,无需再自己写一堆。
p
~~~
``p`` 也是个函数是inspect库的包装。它能详细输出表中的所有值包括元表。
因此在使用它输出和类相关的东西的时候还是放弃为好...
json.encode
~~~~~~~~~~~
将不含循环引用的表转换为json字符串。或许会很有用吧。但是不如p就是了。
GameLogic:dumpEventStack()
~~~~~~~~~~~~~~~~~~~~~~~~~~
输出当前的事件栈。在处理插结的时候能派上用场。