私が念頭に置いている具体的な例には、現在アルファ版のゲームMinecraftが含まれていますが、これは、ある程度の会話が必要だと思う一般的な質問です。
MinecraftはJavaで記述されており、スタックトレースは通常次のようになります(実際の例)。
Java.lang.NullPointerException
at d.a(SourceFile:247)
at gi.b(SourceFile:92)
at bd.a(SourceFile:33)
at bn.a(SourceFile:69)
at bn.e(SourceFile:115)
at bn.d(SourceFile:103)
at net.minecraft.client.Minecraft.i(SourceFile:1007)
at net.minecraft.client.Minecraft.run(SourceFile:596)
at Java.lang.Thread.run(Unknown Source)
明らかに、これらは開発者が書いたときに使用する実際のパッケージおよびメソッド名ではありません。彼はアルファ段階にあるので、特に誰かがバグレポートにスタックトレースを提供できる場合、開発者はスタックトレースを理解できるようにしたいようです。現状では、ほとんど意味がありません。
より困難なバグ識別の欠点を克服するこのようなコードを難読化することで、どのような利点を得ることができるでしょうか?
Javaコードも難読化しています...
利点は、リバースエンジニアリングが困難になることです(たとえば、誰かがコードベースを盗み、それをベースとして使用して同様の競合製品を作成することなどが心配な場合)。
元のスタックトレースを元に戻すことができます。難読化されたスタックトレースを実行するために使用できる特別な参照ファイルを作成する難読化ツールがそこにあり、元のソーススタックトレースに付属しています。これらは難読化プロセス自体によって生成されるため、最初にコードを難読化するために使用した参照ファイルを入手しない限り、元のスタックトレースを取得できません。
これには実際に欠点はありません。 :)
ほとんどの難読化ツールもコードを最適化する、不要なメタデータまたは未使用のコード、圧縮、デッドコードの除去、または重複の除去を削除します。