ZZRでツーリングマップル(中四国版)全制覇への道 〜ついでにLinuxハッカーも目指してます〜

どうも。ここは、バイクを買って一年ちょっとの駆け出しライダー兼Linux狂のITサラリーマンのブログです。 ツーリングマップルの全ページ制覇の記録と、日々のLinuxハッキングの記録を記します。

[Vista] これは Vista がおかしいのか?

Vista 上のアプリケーションの評価をやってるけど、何か、変なんだよね。

変1
あるXML(UTF-8)ファイルがありました。これをメモ帳で開きました。色付された状態で見たいので、秀丸(6.1)で開きました。 すると、メモ帳と秀丸とでは表示される内容が違うではありませんか! 具体的には、メモ帳では表示されるファイル末尾数行が、秀丸では表示されない(もしくはその逆だったかもしれない。ちょっと記憶あやふや)。

これだけなら秀丸かメモ帳のバグだと思うとこだけど、さらに恐ろしいことが。


変2
アプリケーションの設定ファイルを "C:\\ProgramData" 以下に置きました。しかし、この設定ファイルを編集して設定を変更しても、どうしても変更がアプリケーションに反映されません。
ひょっとして、アプリケーションが違うパスにあるファイルを見ているのでは? とおもって、Microsoft のありがたい無料ツール Process Monitor で、プロセスがどのファイルを開いているかを確認してみました。すると、確かに上記で編集したファイルを開いていました。
もうこれはソースレベルでデバッグするしかないというこで、VisualStudio でデバッグしてみました。すると、確かにこのファイルを開いて、設定も読み込んでいます。変数にも変更後の値が入って"いました"。しかし、ステップ実行を続けていくと、「あれ、いつの間にか値が変わってる…」。この変数は、初期値を設定した後は値は変わらないはずです。しかし、編集後の設定ファイルのどこをどうみても記述されていない値が、いつの間にか変数に入ってしまっているのです。しかも、そのいつの間にか入っていた値というのは、設定ファイルの編集前の元の値という世にも奇妙な現象が ((((;゜Д゜)))ガクガクブルブル…

「プログラムのバグじゃねーの?」と普通は思います。

しかし、この設定ファイルの読み込みは Windows XP ではきちんと読み込めているし、XP では設定ファイルの変更もアプリケーションに反映されています。

試しに、設定ファイルを置くパスを "C:\\" 以下にしてみました。すると、設定ファイルの変更がアプリケーションに反映されました。え…

Vista の "C:\\ProgramData " や "C:\\Users" って、2000, XPとの互換性を保つために接合点とかいうのが設けられてるらしいけど、今回の挙動も「仕様」なのかな?

コメント

へん2

なんのアプリか存じませんが、設定ファイルの変更後のアプリの再起動はしてるよね?

アプリの再起動をしても設定が変更されないんなら、その設定ファイルはほかのアプリと共有してるなんてこたないですかね?

つまり他のアプリがその設定ファイルの内容を読み込んでメモリにマッピングしている状態で、設定ファイルを変更したとしましょう。その後、同じ設定ファイルを使用する、また違うアプリを起動しても、新たに起動されたアプリは HDD に設定がフラッシュされたファイルじゃなくてメモリにマッピングされてる古い設定ファイルを読みこんでるんじゃないかと、ちょっと思いました。

まぁ普通はぜんぜん違うプロセス間でそんなことしないだろうけど。でも最初に起動したアプリと後から起動したアプリの実行ファイルが同じだったりすると(メモ帳を二コ開くような場合、notepad.exe が二個できる)、そいうことも起きるかもしんないですね。ま、勝手な推測ですが。

  • 2007/08/31(金) 00:05:45 |
  • URL |
  • りんこ #-
  • [ 編集]

>りんこ
アドバイスサンクス。
なるほど〜。

>なんのアプリか存じませんが、設定ファイルの変更後のアプリの再起動はしてるよね?
もちろんしている。

>アプリの再起動をしても設定が変更されないんなら、その設定ファイルはほかのアプリと共有してるなんてこたないですかね?
他のアプリとの共有はしていない。

本当にそのファイルを開いて読み込んでいるのかを調べるために、Microsoft の Process Monitor ってツールで観察してみたけど、確かに設定ファイルを開いて(CreateFile呼出)、ファイルから読み込んでいる(ReadFile呼出)ことを確認して、デバッガでも変更後の値が入ってることを確認したけど、プログラムが進むうちに、"いつのまにか"、値が変わってるんだよね。

しかも、ファイルの置き場所変えたらうまくいくという…

  • 2007/09/01(土) 10:36:10 |
  • URL |
  • 管理人 #-
  • [ 編集]

そうすか、、、、んじゃいつの間にか置き換わっている、仮想アドレスにマップされた設定ファイルを「write access break」してみたら?
windbg でやるならプロセスにアタッチして 「ba w 1 "設定ファイルがマップされてる仮想アドレス"」とかで適当にブレイク張って、g してヒットしたら kv コマンドでスタック表示させたら誰が(どのモジュールが)書き換えてるかわかると思うで。

でもわかったところでどないやっちゅうねん。ということになるかもしれませんがw

ていうか「デバッガでも変更後の値が入ってることを確認」ってのはどうやったん?暇なとき教えてくだされ。

  • 2007/09/05(水) 22:34:15 |
  • URL |
  • りんこ #-
  • [ 編集]

windbg は使ったことないから勉強せんとといかんな〜

>ていうか「デバッガでも変更後の値が入ってることを確認」ってのはどうやったん?暇なとき教えてくだされ。
これは普通に VisualStudio でステップ実行しながら確認しただけだよ♪

いまはWindowsファイアウォールについて調査中。

  • 2007/09/22(土) 11:40:25 |
  • URL |
  • #-
  • [ 編集]

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://motonux.blog90.fc2.com/tb.php/25-46d39ccc
この記事にトラックバックする(FC2ブログユーザー)

ホームページ アフィリエイト レンタルサーバー FC2ブログ