饥荒游戏吧 关注:204,172贴子:2,999,574

21-03-17【MOD】快速定位mod崩溃bug

只看楼主收藏回复


作者:小豪


IP属地:辽宁1楼2021-03-17 23:38回复
    2L


    IP属地:辽宁2楼2021-03-17 23:38
    收起回复
      2025-06-10 00:57:13
      广告
      以下内容来自创意工坊简介:
      【错误追踪】
      本mod灵感来自风铃草大佬的loguploader模块,开发过程中也请教了他很多问题,前排感谢!!!
      简介众所周知,游戏只要开了mod就可能发生崩溃。崩溃不是大问题,但弹出来的那些不知所云的代码和断开连接提示,让人很烦燥。
      本mod可以帮你快速定位到崩溃点,废话不多说直接上图。

      【日志同步】
      作为客机加入房间时,如果服务器发生错误,只会显示“你与服务器断开连接”。本mod会将报错信息发送到本地,无论是带洞穴的世界,还是专用服务器,都可以在客户端直接查看报错日志了。
      注意:没有管理员权限的玩家无法查看日志,仍然只显示断开连接。
      【一键打开】
      日志点击绿色文字,就能直接查看报错日志内容。



      IP属地:辽宁3楼2021-03-17 23:41
      回复
        【错误定位】
        发生崩溃后,哪个mod应该背锅呢?
        ●崩溃点(深红色)
        指示错误发生的实际位置。游戏本体或者具体的某个mod。
        ●回溯路径(红色)
        引发错误的链条中的一环。
        ●警告(黄色)
        mod虽然不在错误链条內,但是本身存在一些不容忽视的问题。
        ●安全(绿色)
        没有问题。
        这个功能利用了Lua的debugtrace来分析引起崩溃的mod。只能处理Lua逻辑层的错误,无法处理c++底层问题!
        分析结果仅供参考。在mod数量很多的情况下,引起崩溃的过程可能会相当复杂,不保证100%的定位准确度。

        【日志发送】
        发现一个mod确实有问题,但不知道怎么通知作者修复?
        本mod附带了日志发送功能,只要点一下,就能把报错信息发送给mod开发者。当然,开发者要预先做相关的适配。
        那这个mod自己到底有没有bug?我也不是很清楚,如果你感觉它出问题了,请联系作者。


        IP属地:辽宁本楼含有高级字体4楼2021-03-17 23:43
        回复
          【如果你是mod开发者,请看这里】
          错误追踪器内置了日志发送功能,玩家只需要点击按钮,就能把日志直接发到你的手里。
          支持两种发送方法: 邮箱、URL。
          要实现这个功能,你的mod需要进行一些简单的配置。请在 modinfo.lua 或 modmain.lua中
          以全局变量的形式声明`bugtracker_config`表,所有配置都应写在这张表内。类似这样:
          bugtracker_config = {
          email = "myemail@dst.com",
          upload_client_log = true,
          upload_server_log = false,
          -- 其它配置项目...
          }


          IP属地:辽宁5楼2021-03-17 23:47
          回复
            1. 设定接收条件
            你可以指定哪些日志允许上传,避免收到一些无意义的报错信息。
            可跳过此设置,使用默认值。
            bugtracker_config = {
            -- * 是否接受客户端报错日志,默认true。
            -- * 大部分mod都包含会在客户端运行的代码,所以建议都设置为true。
            upload_client_log = true,
            -- * 是否接受服务器报错日志,客户端mod默认false,服务器mod默认true。
            -- * 建议默认。
            upload_server_log = true,
            -- * 是否接受其它mod引起的报错日志,默认true。
            -- * 可能有助于解决mod之间的冲突
            upload_other_mods_crash_log = true,
            -- 其它配置项目...
            }


            IP属地:辽宁6楼2021-03-17 23:48
            回复
              2. 设定邮箱
              如果你希望玩家将日志发送到你指定的邮箱,你需要添加`email`键,如下所示:
              bugtracker_config = {
              -- * 注意: 不要设置成工作的邮箱!建议注册一个新邮箱专门用于接收日志。
              email = "myemail@dst.com",
              -- * 邮件内容默认为英文,如果你想接收中文邮件,请将`lang`键设置为"CHI"。
              lang = "CHI",
              -- 其它配置项目...
              }
              这样一来,当玩家点击上传日志按钮后,日志会发送至你的邮箱。
              每日发送上限为100封。(理解理解,我怕发的太频繁账号被网易封了)


              IP属地:辽宁7楼2021-03-17 23:48
              回复
                好帖好mod


                IP属地:澳大利亚来自Android客户端8楼2021-03-17 23:48
                回复
                  2025-06-10 00:51:13
                  广告
                  3. 设定URL
                  如果你恰好有一个网络服务器,强烈建议你配置一个专用的上传URL,日志信息将直接以POST的方法发送至你的服务器。
                  该配置的优先级高于 email 。如果同时设置 email 和 url ,只有 url 会生效。
                  bugtracker_config = {
                  -- * 请务必带上协议,如 http:// 或 https://
                  url = "http://127.0.0.1:8000/demo/",
                  -- 其它配置项目...
                  }
                  上传的数据结构为 <摘要区字节数> 摘要区(json格式)日志内容(纯字符串)
                  这是使用python-django的后端解析示例,可供参考。(我没学过php和java,所以没有例子)


                  IP属地:辽宁9楼2021-03-17 23:49
                  回复
                    # 示例开始
                    import re
                    import json
                    from django.http import HttpResponse
                    def parsebody(body: bytes) -> dict:
                    '''饥荒只能POST字符串,服务器需要对上传的内容进行解析。
                    数据结构为 <摘要区字节数> 摘要区(json格式) 日志内容(纯字符串)
                    摘要区包含一些基础信息,日志则包含详细的报错内容。
                    摘要结构:
                    gameversion<str> 饥荒版本号
                    platform<str> 运行平台
                    playername<str> 向您发送日志的玩家昵称
                    modname<str> 模组名
                    modversion<str> 模组版本号
                    diagnose<str>诊断信息
                    timestamp<int> 崩溃发生的时间戳
                    ingame<bool> 崩溃发生在世界启动后
                    isserver<bool> 崩溃点位于服务器
                    isdedicated<bool> 崩溃点位于专用服务器
                    apiversion<str> 错误追踪器版本号
                    '''
                    match = re.match(b"^<(\\d+)>.", body)
                    if match is not None:
                    # parse abstract length
                    abslenstr = match.group(1)
                    abslen = int(abslenstr)
                    # don't forget `<` and `>`!
                    absstart = len(abslenstr) + 2
                    # parse abstract, note abstract may contain utf-8 character.
                    jsonstr = body[absstart: absstart + abslen].decode("utf-8")
                    # Here we get abstract!
                    abstract = json.loads(jsonstr)
                    # Here we get log content!
                    log = body[absstart + abslen: ].decode("utf-8")
                    return {
                    "abstract": abstract,
                    "log": log,
                    }
                    def demo(request):
                    ''' Your url function '''
                    if request.method == "POST":
                    result = parsebody(request.body)
                    if result:
                    abstract = result["abstract"]
                    log = request["log"]
                    # Now do anything you want to do.
                    # (For example, save log file in the database or send an email.)
                    # Actually, BugTracker doesn't handle response, but you need this to avoid 500.
                    return HttpResponse("")
                    # 示例结束


                    IP属地:辽宁10楼2021-03-17 23:50
                    回复
                      本mod所有代码开源无混淆。


                      IP属地:辽宁11楼2021-03-17 23:50
                      回复


                        IP属地:江苏来自Android客户端13楼2021-03-18 00:40
                        回复
                          好东西


                          IP属地:江苏来自Android客户端14楼2021-03-18 11:34
                          回复