2008年12月28日
川俣晶の縁側ソフトウェア技術雑記 total 3413 count

NProf 0.10で日本語名が文字化けする原因の調査結果

Written By: 川俣 晶連絡先

 NProf 0.10は無料で使える.NET用プロファイラで問題はあるものの重宝しています。しかし、日本語のメソッド名等が文字化けします。

 原因を調べたので以下にまとめます。

原因 §

 おそらく、NProf.Hookプロジェクト内のHook.cppの以下の箇所で化けています。

void ProfilerHelper::GetFunctionSignature( 

    FunctionID functionId,

    UINT32& methodAttributes,

    string& returnType, 

    string& className,

    string& functionName,

    string& parameters )

{

    ULONG args;

    WCHAR returnTypeString[ MAX_FUNCTION_LENGTH ];

    WCHAR parametersString[ MAX_FUNCTION_LENGTH ];

    WCHAR functionNameString[ MAX_FUNCTION_LENGTH ];

    WCHAR classNameString[ MAX_FUNCTION_LENGTH ];

    GetFunctionProperties( functionId, &methodAttributes, &args,

            returnTypeString, parametersString, classNameString,

            functionNameString );

    returnType = CW2A( returnTypeString );

    parameters = CW2A( parametersString );

    className = CW2A( classNameString );

    functionName = CW2A( functionNameString );

}

 GetFunctionPropertiesからはUnicode文字列で受け取っているにも関わらず、ここでcharの文字列であるstring型に変換してしまっています。string型はVisual C++のヘッダーファイルxstringで定義されている型で、隣にはwchar_tを使った同等のwstring型も定義されています。

typedef basic_string<char, char_traits<char>, allocator<char> >

    string;

typedef basic_string<wchar_t, char_traits<wchar_t>,

    allocator<wchar_t> > wstring;

 おそらく、Hook.cppだけwstringを使うように直せば文字化けは直ると思われますが、単純置換だけでは上手く行きませんでした。

 対処は、時間がないのに現実逃避のネタを探している優秀な技術者に任せるとしましょう。

追記 §

 結局、自分でやってしまった……。がっくし。