1

コンソール ゲームの出荷の最終段階に入っています。もちろん、Wii ではメモリに関する問題が最も多いため、ずさんなコーディングを探したり、ビットを詰めたりするのに忙しくしています。

メモリのダンプを作成し、strings.exe (sysinternals から) を使用して分析しましたが、次のような多くのガンクが発生しています。

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

私はこのような文字列にもっと興味があります:

wood_wide_end.bmp
restroom_stonewall.bmp

...これは、ID に変換する必要があるある種の文字列をまだ埋め込んでいることを意味します。

私の質問は、削除できるデバッグ データである可能性が高いものを見つけるための良い方法は何ですか?

rx を実行してシンボルをハックしたり、特定の種類の文字列を検索したりできます。しかし、私が本当にやりたいのは、標準の辞書ファイルを手に入れて、それに対して文字列ファイルを検索することです。aardvaark|alimony|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

しかし、あなたは間違った場所に注意を向けていると思います。デバッグ文字列を排除すると、利益は非常に少なくなります。デバッグ データを削除することは、Nintendo が要求する技術認定要件ですが、ELF に余分な文字列がいくつかあることであなたを跳ね返すとは思いません。

プロファイラーを使用して、最も多くのメモリを使用している場所を特定してみてください。エネルギーを適切な場所に集中させれば、ほとんど労力をかけずに大量のメモリを節約できる可能性があります。

于 2009-05-31T16:16:22.307 に答える
0

これは、正規表現をサポートする何かでの迅速で汚いスクリプトにとって理想的なタスクのように思えます。それが私だったら、私はおそらくPythonで本当に素早く何かをするでしょう。

処理方法は次のとおりです。(strings.exe の出力から) 文字列に遭遇するたびに、それを辞書に記録するか、永久に無視するかをユーザーに尋ねます。ユーザーが文字列を永続的に無視することを選択した場合、将来遭遇したときに、ユーザーにプロンプ​​トを表示せずに破棄します。オプションで、アンチディクショナリ ファイルを保持して、今後のスクリプトの実行のためにこれを記憶することができます。辞書ファイルを作成し、文字列ごとにカウントまたはその他の情報を保持します。必要に応じて、文字列が出現する回数で並べ替えて、最も悪質な犯罪者に焦点を当てることができます。

これは、スクリプト言語を学習するための理想的なタスクのように思えます。C#/C++ や、これを実装するのに本当に凝ったものをいじる気は​​ありません。

于 2009-05-31T16:01:48.080 に答える