1

我们正处于发布主机游戏的最后阶段。当然,在 Wii 上,我们在内存方面遇到的问题最多,所以我们正忙于寻找草率的编码、打包位等等。

我已经完成了内存转储并使用 strings.exe(来自 sysinternals)来分析它,但它提出了很多像这样的垃圾:

''''$$$$    %%%%
''''$$$$%%%%####&&&&
''''$$$$((((!!!!$$$$''''((((####%%%%$$$$####((((
''))++.-$$%&''))
'')*>BZf8<S]^kgu[faniwkzgukzkzkz
'',,..EDCCEEONNL

我对这样的字符串更感兴趣:

wood_wide_end.bmp
restroom_stonewall.bmp

...这意味着我们仍在嵌入一些需要转换为 ID 的字符串。

所以我的问题是:有什么好的方法可以找到我们可以消除的调试数据?

我可以做一些 rx 来破解符号或只搜索某些类型的字符串。但我真正想做的是获取一个标准字典文件并根据它搜索我的字符串文件。如果我要使用 aardvaark|almony|archetype 等构建一个大 rx,这似乎很慢。或者,如果我为它做一个 .NET 编译的 rx 程序集,它会工作得很好吗?

寻找关于如何找到我们想要消除的东西的其他想法。快速而肮脏的解决方案,不需要优雅。谢谢!

4

2 回答 2

1

首先,我会得到一个很好的单词表。 这个 NPL 页面有一个很好的列表,包含不同大小和来源的单词列表。我要做的是为单词列表中的所有单词构建一个哈希表,然后根据单词列表测试输出的每个单词strings。这在 Python 中很容易做到:

import sys

dictfile = open('your-word-list')
wordlist = frozenset(word.strip() for word in dictfile)
dictfile.close()

for line in sys.stdin:
    # if any word in the line is in our list, print out the whole line
    for word in line.split():
        if word in wordlist:
            print line
            break

然后像这样使用它:

strings myexecutable.elf | python myscript.py

但是,我认为您将注意力集中在错误的地方。消除调试字符串的收益非常递减。尽管消除调试数据是任天堂要求您执行的技术认证要求,但我认为他们不会因为您的 ELF 中有几个额外的字符串而拒绝您。

使用分析器并尝试确定您使用最多内存的位置。如果您将精力集中在正确的位置,很有可能会有一种方法可以轻松地节省大量内存。

于 2009-05-31T16:16:22.307 回答
0

这听起来像是支持正则表达式的快速而肮脏的脚本的理想任务。如果是我,我可能会很快在 python 中做一些事情。

下面是我将如何进行:每次遇到字符串(来自 strings.exe 输出)时,提示用户他们是想在字典中记住它还是永久忽略它。如果用户选择永久忽略该字符串,那么以后遇到它时,不要提示用户并丢弃它。您可以选择保留一个反字典文件,以便在以后运行脚本时记住这一点。建立字典文件并为每个字符串保留一个计数或您想要的任何其他信息。可以选择按字符串出现的次数排序,这样您就可以专注于最严重的违规者。

这听起来像是学习脚本语言的理想任务。我不会打扰 C#/C++ 或任何真正花哨的东西来实现它。

于 2009-05-31T16:01:48.080 回答