IME処理のログ出力機能
32ビットアプリケーションについては実現できて、64ビットアプリケーションについても技術的な目処が立っています。
今後、リソースの確保や開放に関するロギングを行い、クラッシュの原因を突き止めるための情報を得ることを目指します。
Windows API の OutputDebugString を使う処理を lp:~nishimotz/nvdajp/releases_2011.2:4231 で導入しました。
DebugView で情報を得ることができます。
http://technet.microsoft.com/ja-jp/sysinternals/bb896647
scons の nvdaHelperDebugFlags オプションを使うデバッグをあわせて検討しています。
2012.1j に向けてIMEサポートの実装を見直す際に検討します。
現在は nvdaHelper/{nvdajpime,nvdajpimeRPC}/nvdajpime.h で DEBUG マクロを書き換えてリコンパイルすれば debugview にログを出せますが、 IME に関するテストを効率化するために、 レジストリの値でデバッグ出力の切り替えを行うことを検討します。
現在実装中の nvdajpime 関連の仕様をまとめます:
regedit で以下のキーを作成すると、x64 および x86 のログを OutputDebugString API で出力する。
\HKEY_LOCAL_MACHINE\Software\nvda -> DebugIME64 (REG_DWORD) 1以上の数字でログ出力 \HKEY_LOCAL_MACHINE\Software\nvda -> DebugIME32 (REG_DWORD) 1以上の数字でログ出力
このログは DebugView で表示できる。
http://technet.microsoft.com/ja-jp/sysinternals/bb896647
レジストリは Windows xp sp3 および Windows 7 sp1 x64 の両方で共通。 (Wow6432Node を使う必要はない)
補足:NVDA + Windows XP + DebugView が不安定になる現象は、IA2 関連のエラーメッセージが大量に出力されるためである。
下記で抑止できることを確認した。
--- nvdaHelper/remote/IA2Support.cpp 2011-10-25 12:35:26 +0000 +++ nvdaHelper/remote/IA2Support.cpp 2012-03-23 03:10:34 +0000 @@ -78,7 +78,7 @@ return FALSE; } if((res=CoRegisterClassObject(IAccessible2ProxyIID,ia2ClassObjPunk,CLSCTX_INPROC_SERVER,REGC LS_MULTIPLEUSE,(LPDWORD)&IA2RegCooky))!=S_OK) { - LOG_DEBUGWARNING(L"Error registering class object, code "<<res); + LOG_DEBUG(L"Error registering class object, code "<<res); ia2ClassObjPunk->Release(); CoFreeLibrary(IA2DllHandle); IA2DllHandle=0;
Windows 8 CP x86 jp + NVDA 2012.1j-beta2 の環境では DebugView の挙動が不安定ですが Trace Spy for Windows 7 を使うとうまくログが表示できます。
上記コメントの Trace Spy ですが Windows XP sp3 でも動きました。
DebugView よりも動作が軽い印象です。デバッグがしやすくなって助かります。
デバッグ出力を制御するレジストリのキーを nvda から nvdajp に変更します。
\HKEY_CURRENT_USER\Software\nvdajp -> DebugIME32 REG_DWORD \HKEY_CURRENT_USER\Software\nvdajp -> DebugIME64 REG_DWORD
lp:nvdajp 4332
ちなみに本家は以下のようにレジストリを使っています。(Windows 7 x64)
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\nvda] "startMenuFolder"="NVDA" "startOnLogonScreen"=dword:00000001
IME関連の調査・原因究明を容易にするために、NVDA のログ出力機能でIME処理(nvdajpime)の情報が得られるようにしてはどうか、という提案を行いました。