活動メモ 2nd season このページをアンテナに追加 RSSフィード Twitter

2006-09-21 ねむい

2006-09-03 原因判明

[]ドリコムRSSのClip!の削除も問題なく動くようになった

結局、原因は cookie 回りの処理に問題があることが判明

  • 通常の「取得」が問題なく、削除用の「取得」で問題が出たのは、後者の cookie 格納領域のサイズが、前者の cookie 格納領域の半分しかなかったため → 要するに、メモリ領域破壊が起きてて、スタックフレームにまで被害が及んでいた
  • Visual C++ 6 でビルドしたロードモジュールでは問題が発見できていなかっただけで、実は通常の「取得」にも問題があった。Visual Studio 2005 の VC++ビルドデバッグしていて発見。これは、自前の http 通信処理内の cookie の取り扱いに問題があった。これもメモリ破壊。

原因がわかったので、ソースを修正。問題なく動くようになりました。

なぜか日本時間なのに夏時間になる(1時間ずれる)

ついでに、バッドノウハウを1つ。Visual Studio 2005 でビルドしたときにリンクされるランタイムモジュールの「これはひどい」仕様に遭遇。環境変数 TZ を設定した状態で、localtime() とかを使うと、(アメリカが夏時間の間は)日本時間(JST)でも無条件で夏時間にされてしまうんですね。ちゃんと MSDN に書いてある(笑) なので、TZ が設定されてて、かつ、タイムゾーンJST のときは強制的に夏時間フラグを off にするコードを入れてしまいました。日本時間以外は考慮してません。

このマイクロソフトの仕様だと、夏時間の開始・終了タイミングが異なる国(ヨーロッパ各国とか)でも困るんじゃないかな? 解決方法は TZ を設定せず、Windowsインストール時(とかコントロールパネル経由とか)に設定したタイムゾーンをそのまま使うこと。ってことみたい。

もう1つ、バッドノウハウ

sniffer とかで観測しているとデータを受信していることが確実なのに recv() が返す受信バイト数が 0 になることがある問題が Windows にはあって(滅多に発生しないんだけど、なぜかドリコムサーバと通信しているときだけは頻繁に発生する)、select() で受信イベントをキャッチしてから Sleep(10) した後、recv() するようにすることで解決します。Sleep(5) だとうまくいかないときがたまにあるので、Sleep(10) にしてみました。なんてアバウト。そういえば、ハードウェアを直接いじるプログラムでは、なぜかおまじない「Sleep(0) を入れる」を唱えると嘘のように何事もなく問題が消滅する、という話を聞いたことがあります。いまはコンパイラが賢いのか、Sleep(0) のままだとコンパイル時にコードが削除されてしまうようなので、0 より大きい値を指定する必要があるみたいですけどね。

2006-09-02 原因不明

[]ドリコムRSSのClip!の削除に対応しようとしてるんだけど

削除処理自体は問題なく動いてるんだけど

謎の挙動が2件。いまだに原因不明。


(1) 削除に必要な情報(articleID)などを取得する処理が動いているとき、ダイアログ再描画のためのメッセージループ中の SetFocus() で落ちる(assertion に引っかかる)。どうも自ウィンドウのハンドルが取れなくて、ここはどこ、私は誰状態になっている模様。いろいろ試行錯誤してみたところ、どうも http 通信中にダイアログの再描画イベントが発生すると、この現象が発生するらしい。他のソーシャルブックマーク(ドリコムRSS以外)では起きたことがないので、ドリコムRSS絡みの処理のどこかに問題があるのは確か。ただし、「削除(のための取得)」ではなく、単なる「取得」(「同期(のための取得)」も含む)では、この現象は発生していません。あと、試しに http 通信中は通信が終わるまでダイアログ再描画を抑制するようにしてみたら、現象が発生しにくくなる効果はあったものの、完全に発生しなくなるわけではないことが判明。根本的な原因は、もっと他のところにあるみたい。


(2) 上記現象を(デバッガによる各種操作で)抑制して何とか削除処理にこぎつけた後、削除を終了してダイアログを閉じようとしたところで、Access Violation が発生する。これも、他のソーシャルブックマークでは発生せず、ドリコムRSS のときだけ発生。基本的にやってる処理は同じ(サーバに送る http リクエストが違うだけ)。


という感じで、未解決の致命的な不具合が2件。あと、無理やりダイアログ再描画が発生しないようにしてテストすると、情報取得が終わって削除ダイアログを出そうとするまでの一連の処理のどこかでスタックオーバーフロー(おそらく無限に再帰呼び出ししている)が発生するという罠。これも今のところ、原因不明。

2005 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 07 | 08 | 09 | 11 |
2008 | 01 | 05 | 06 | 10 | 11 | 12 |
2009 | 01 | 03 | 05 | 06 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 09 |
2011 | 01 |
最近のコメント

BlogPet研究本(同人誌)「こうさぎHACKS」の最新刊や Twitter本 をコミックマーケット78にて頒布予定。
現在、寄稿者募集中。BlogPetとか「ブログ妖精ココロ」とかで何か書きたい・描きたい人、大歓迎!!

なお、「こうさぎHACKS」のスペースは、2010年8月14日(夏コミ2日目)、東エ02b になりました。コミケに参加する方は、ぜひお立ち寄りください。

Connection: close