rimworld吧 关注:244,365贴子:4,376,804

RimWorld:故障排查指南(日志相关)

只看楼主收藏回复

前言
相关内容来自RimWorld Wiki ,本文仅做翻译和有限的补充,除非另有说明,所属内容均在 CC BY-SA 3.0 下提供。
贴吧这暂时不能放原文链接,CSDN那边仍然正常展示原文链接。
CSDN链接:http://t.csdnimg.cn/39mNo
以及赛博乞讨:
https://i0.hdslb.com/bfs/new_dyn/54bf946e49f7612dcc13ca07cf587f098040337.png
水平有限,如有错漏,敬请见谅
如果您喜欢这篇文章,麻烦大家帮我点个赞,谢谢大家的支持!


IP属地:中国香港1楼2024-02-01 15:49回复
    常见的XML错误


    IP属地:中国香港2楼2024-02-01 15:50
    回复
      语法错误
      对于初学者来说,最常见的错误是格式和语法错误。如缺少括号、未闭合的标签、空文件等,这些都可以通过使用适当的工具来避免。
      通过一个合适的文本编辑器(或插件)可以突出显示、警告这些基本问题。RimWorld不会因这些问题警告你,最好的情况下游戏会带着错误运行,最坏的情况下游戏会直接拒绝启动。
      大小写错误和意外空格同样是语法错误。compClass 和 CompClass 是两个不同的东西。空格同样邪恶,<compClass>MyNamespace.MyClass </compClass> 会让你永远摸不着头脑,为什么RimWorld找不到 MyNamespace.MyClass 。
      看不出 <compClass>MyNamespace.MyClass </compClass> 有什么错误?
      现在呢 <compClass>MyNamespace.MyClass[空格]</compClass> ?


      IP属地:中国香港3楼2024-02-01 15:50
      回复
        交叉引用 Cross-references
        关键词(译者附):Could not resolve cross-reference
        1、 def A 想要使用 def B,但是找不到 def B。这些交叉引用是通过 defName 进行的。Type 和 defName必须匹配。如下例:

        这表示名为 ExampleThing 的 ThingDef 试图使用名为 Slurp 的 SoundDef ,但游戏找不到名为 Slurp 的 SoundDef 。
        这种交叉引用一般长这样(译者附):

        2、如果游戏在列表中找不到交叉引用,则错误略有不同:

        这表示 thingCategories 试图获取名为 BuldingsPower 的 ThingCategoryDef ,但失败了。其中wanter=thingCategories 是可选显示的附加项。
        这种交叉引用一般长这样(译者附):


        IP属地:中国香港4楼2024-02-01 15:53
        回复
          定义同一字段/标签两次 Defining the same field/tag twice
          关键词(译者附):defines the same field twice

          上例表示,有一个 ThoughtDef 却错误的包含两个 stackLimit 标签的。这可能是错误的在XML文件中定义了两次标签,也有可能是两个模组对相同 Def 的进行补丁操作后果,此时第一个模组优先。后一种情况是一种典型的模组冲突,缺乏防御补丁。另请参见防御补丁。
          你可以从Whole XML: < 一堆XML标签 >定位到出现错误的XML标签的名称。


          IP属地:中国香港5楼2024-02-01 15:54
          回复
            引用不存在的字段 Referencing a non-existing field
            关键词(译者附):doesn't correspond to any field in
            当在日志中看到这样的错误信息:
            XML error: <costStaffCount>50</costStaffCount> doesn't correspond to any field in type ThingDef. Context: <ThingDef ParentName="SculptureBase"><defName>SculptureSmall</defName><label>small sculpture</label><description>An artistic sculpture.</description><stuffCategories><li>Metallic</li><li>Woody</li><li>Stony</li></stuffCategories><costStaffCount>50</costStaffCount></ThingDef>
            略微整理一下:

            这表示在名为 SculptureSmall 的 ThingDef 中使用了<costStaffCount>标签,但 ThingDef 中根本不存在<costStaffCount>标签。
            这可能是由简单的拼写错误、将标签放在错误的节点、缺少(DLL)依赖项、由于早期错误而无法加载(DLL)依赖项以及使用了过时模组等情况引起的。
            注意:XML标签只能对应于 C# 中定义的字段。


            IP属地:中国香港6楼2024-02-01 15:55
            回复
              关于(解决)XML错误的注意事项
              XML错误是级联的。
              在后台,RimWorld将所有 def 组合到一个庞大的XML文档中。如果一个标签<tag>缺少其对应结束标签</tag>,那么解析器将无法读取任何XML,你将看到一大堆红色错误。
              不要恐慌,先找到第一个XML错误,并修复它。不要去管后面的其它错误。重新加载游戏,然后再修复下一个错误(如果有的话)。


              IP属地:中国香港7楼2024-02-01 15:55
              回复
                堆栈跟踪
                通常所谓的 模组冲突/不兼容/加载顺序问题 归根结底只是一个Bug。就像80%的统计数据都是当场生成的一样,RimWorld中98%的报告错误都是 NullReferenceExceptions(空引用异常)。这些被遗忘的null检查可能很难被定位,但一旦定位成功,一般很容易解决。
                从上到下阅读堆栈跟踪,首先是错误,然后是导致错误的所有方法。让我们看看下面的堆栈跟踪:
                Exception in BreadthFirstTraverse: System.NullReferenceException: Object reference not set to an instance of an objectat Gloomylynx.TantrumPatch.CheckForDisturbedSleepPrefix (Verse.Pawn) <0x00021>at (wrapper dynamic-method) Verse.Pawn.CheckForDisturbedSleep_Patch1 (object,Verse.Pawn) <0x00020>at Verse.Pawn.HearClamor (Verse.Thing,Verse.ClamorDef) <0x000b4>at Verse.GenClamor/<DoClamor>c__AnonStorey0.<>m__0 (Verse.Region) <0x001b0>at Verse.RegionTraverser/BFSWorker.BreadthFirstTraverseWork (Verse.Region,Verse.RegionEntryPredicate,Verse.RegionProcessor,int,Verse.RegionType) <0x000f7>at Verse.RegionTraverser.BreadthFirstTraverse (Verse.Region,Verse.RegionEntryPredicate,Verse.RegionProcessor,int,Verse.RegionType) <0x00130>
                图片:

                - Exception in BreadthFirstTraverse:捕获错误的位置:那里有一个try/catch块,并且捕获了这个错误;
                - System.NullReferenceException: Object reference not set to an instance of an object:错误类型。NullReferenceExceptions 是最常见的错误类型。它表示“没有为引用对象设置实例”,这意味着某些内容没有初始化(= 实例化);
                - 堆栈跟踪的底部通常不太有趣,大多数有用的东西都是从 ~3 次调用开始的。在本例中,Verse.GenClamor 调用了 Pawn.HearClamor,后者调用了 Pawn.CheckForDisturbedSleep,后者调用了 Gloomylynx.TantrumPatch.CheckForDisturbedSleepPrefix,最终导致了错误;
                - at (wrapper dynamic-method) Verse.Pawn.CheckForDisturbedSleep_Patch1 (object,Verse.Pawn)这是使用了 Harmony Patch 的证据。HugsLib 提供了所有Harmony Patch 方法的列表,这通常有助于查看某个模组做了什么。如果你发现了一个错误,但没有相关模组的提示,该列表会很有帮助。
                - 如果堆栈跟踪中有多个 Harmony Patch 方法,则可能存在模组冲突。不过大多数时候还是因为抛出错误的模组没有考虑某些内容可能是空(null)的。顾名思义,Harmony (和谐)的美妙之处在于多个模组可以毫无问题地修补相同的方法。


                IP属地:中国香港8楼2024-02-01 15:57
                回复
                  提交错误报告
                  使用穷举模组组合的方式来测试模组是完全不可能的。有些模组有数千行代码,因此 x breaks 并不能帮助任何人解决问题。模组制作者可以尽最大努力进行游戏测试,但某些模组配置很可能是制作者独有的。如果玩家在模组游玩过程中遇到问题,请务必通知模组制作者。命令模组制作者修复问题是糟糕的行动(毕竟模组制作者都只是“志愿者”),但大多数模组制作者都希望他们的模组没有问题。
                  日志(Logs),特别是由HugsLib提供的日志,在定位问题的位置方面具有巨大的价值。解决问题的第一步是告知模组制作者你遇到的问题并向他们提供日志和重现步骤。
                  译者附:问题描述(必须) + 日志(必须) + 重现步骤(如果可以)
                  请参阅本指南(CSDN那有链接),了解如何以最佳方式提交错误报告。


                  IP属地:中国香港9楼2024-02-01 15:58
                  回复
                    OK,收工


                    IP属地:中国香港10楼2024-02-01 15:58
                    回复
                      很有帮助,不过我的xml红字因为打了xml extension奇异的消失了?


                      IP属地:湖北来自Android客户端11楼2024-02-01 16:48
                      回复


                        IP属地:四川来自Android客户端12楼2024-02-01 16:51
                        回复
                          要长脑子了


                          IP属地:湖南来自Android客户端13楼2024-02-01 16:53
                          回复
                            问下开游戏后完全不跳出来问题日志了,这个是啥毛病?感觉是打了什么MOD导致的


                            IP属地:浙江来自Android客户端14楼2024-02-01 17:42
                            收起回复
                              用rimpy排序,进入游戏没有跳出来日志,然后这个日志还能自己打开的吗?没找到这个


                              IP属地:浙江来自Android客户端15楼2024-02-01 17:56
                              收起回复