跳转至

调试常见问题

Unity或Unreal Engine调试断点不命中怎么办?

在输出窗口搜索 x-studio Debug System 查看关于lua代码文件路径的打印,检查是否是相对于工程路径,理论上,只要是相对于工程的路径,都可以命中断点,否则就需要手动修改 xxx.xsxproj 文件,在 debug-options 节点下添加代码搜索路径, 如下配置表示将工程 Assets\MyLuaFolder 添加为搜索路径(类似VS C++调试器里的sourceSearchPaths):

<search-paths>
  <item>Assets\MyLuaFolder</item>
</search-paths>

如何让调试器在指定dll中搜索Lua虚拟机核心API?

通过添加 debug-options/lvm-dll-pattern 设置正则表达式搜索即可,默认值: ((\b(lib)?lua5[1-9])|plainlua|xlua|slua|tolua|(UE4Editor\-(slua_unreal|UnLua)[\-A-Za-z0-9]*))\.dll , 正则表达式语法可以参考: C++11 ECMAScript

断点混乱怎么办?

我们都知道,有不少调试器在调试过程中默认是禁用编辑的,例如VS C#等,为方便代码编写, x-studio是允许修改代码的,多数情况下,会自动映射断点行;但少数情况会映射失败, 此时关闭文档(Ctrl+W),重新打开即可,再次启动调试,就可以解决混乱了。

断点莫名其妙无法命中怎么办?

检查是否是大小写问题,由于Windows是不区分文件大小写的,因此即使代码中require路径大小写 和实际磁盘不一致,依然可以成功加载脚本,但此时,不一致的代码文件断点是无法命中的。

为什么在文档中查看代码已经运行,但却没有实际输出?

检查开发目录和exe所在目录是否都有相同文件名代码,cocos引擎默认会优先加载exe所在目录下的代码, 开发过程中,始终保持工程根目录下的src目录一份代码,并删除exe所在目录下的代码是一个良好的开发习惯,这是 早期cocos lua的设计缺陷,应该摒弃。

如何传递将设备尺寸参数传递给被调试程序?

在游戏开发过程中,通常都有设计尺寸和设备尺寸以及朝向,那么,使用x-studio启动调试时 可将这些参数传递给被调试程序,首先在.xsxproj工程文件中添加 debug-options 节点下添加 passing-view-args (10.0.5900.199及之前版本,请添加 pass-size-args) 元素, 值为1,那么调试器会传递如下格式参数: --design-size=720x1280 --device-size=640x960 --orientation=landscape or --orientation=portrait

  /* 解析C++代码参考 */
  namespace xscmdl
  {
    static inline bool check_arg(const char* arg, const char* name) { return 0 == stricmp(arg, name); }
    static inline bool check_arg(const wchar_t* arg, const wchar_t* name) { return 0 == wcsicmp(arg, name); }

    template <size_t _Size>
    static inline bool check_arg(const char* arg, const char (&name)[_Size], size_t& n)
    {
      n = _Size - 1;
      return 0 == strnicmp(arg, name, n);
    }
    template <size_t _Size>
    static inline bool check_arg(const wchar_t* arg, const wchar_t (&name)[_Size], size_t& n)
    {
      n = _Size - 1;
      return 0 == wcsnicmp(arg, name, n);
    }
  }

  int main(int argc, char** argv) {
    std::string_view value;
    size_t len = 0;
    int w = 0, h = 0;
    for (int i = 0; i < argc; ++i) {
      if (xscmdl::check_arg(argv[i], "--device-size=", len)) {
        value = argv[i] + len;
        char* mulp = nullptr; // the 'X' pos
        w = strtol(value.data(), &mulp, 10);
        if(mulp)
          h = strtol(mulp + 1, nullptr, 10);
      }
    }
  }