karno / StarryEyes

Krile StarryEyes, development has been abandoned.
Other
163 stars 40 forks source link

デュアルモニター時に強制終了が発生する #135

Closed liptoton closed 9 years ago

liptoton commented 10 years ago

2.9.42から使用しています。Twitterから失礼しました。 Krileをメインモニターからサブモニターへ移動後に強制終了します。

ディスプレイ機能で「表示画面を拡張する」にして、メイン(左)サブ(右)にした場合は ツイートは可能でしたがKrileを最大化→最小化で再現性ありの強制終了(エラーレポートが出るタイプ)。 メイン(下)サブ(上)にした場合はKrileをアクティブウィンドウにしただけで強制終了。

表示画面の位置によって挙動がかわるのが気になりました。

Windows7 HomePremium(64bit) Core i7-2600、Memory16GB、GTX760 2GB(driver340.52)

以下エラーログです。 Krile STARRYEYES #2.9.42 - 2014/09/18 9:31:26 User ID: d2aec91b-e0b4-48e2-9d30-594593aa91aa Microsoft Windows NT 6.1.7601 Service Pack 1 x64 execution mode: Default, multicore JIT: True, hardware rendering: True application uptime: 00:04:29

exception stack trace: System.OverflowException: 算術演算の結果オーバーフローが発生しました。 場所 Microsoft.Windows.Shell.WindowChromeWorker._HandleNCHitTest(WM uMsg, IntPtr wParam, IntPtr lParam, Boolean& handled) 場所 Microsoft.Windows.Shell.WindowChromeWorker._WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 場所 System.Windows.Interop.HwndSource.PublicHooksFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 場所 MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 場所 MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o) 場所 System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) 場所 MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)

Microsoft Windows NT 6.1.7601 Service Pack 1

karno commented 10 years ago

メインモニタ・サブモニタの大きさや解像度もレポートしていただけますか?よろしくお願いします。

karno commented 10 years ago

参考情報? https://connect.microsoft.com/VisualStudio/feedback/details/809650/arithmetic-overflow-in-microsoft-windows-shell-windowchrome

liptoton commented 10 years ago

メインが BENQ XL2420T Dual-DVI接続 1920_1080 サブが MITSUBISHI MDT242WG DVI接続 1920_1200 となります

foxperia commented 10 years ago

当方、 メイン:1920x1080 サブ:1680x1050 のデュアルディスプレイ環境ですが、特に強制終了などは発生していません。 以上、報告まで。

ghost commented 9 years ago

こちらの環境では メインディスプレイからサブディスプレイに移動→最大化→最大化解除または最小化 という手順を踏むと強制終了しエラーレポートが出ます。(再現性あり)

環境

Krile STARRYEYES #2.9.47 - 2015/02/03 13:10:56
User ID: fc2467cd-d51b-4cc3-9dca-8bb3540fdbd3
Microsoft Windows NT 6.2.9200.0 x64
Built on: v4.0.30319, running on: v4.0.30319
execution mode: Default, multicore JIT: True, hardware rendering: True
application uptime: 00:00:14

exception stack trace:
System.OverflowException: 算術演算の結果オーバーフローが発生しました。
   場所 Microsoft.Windows.Shell.WindowChromeWorker._HandleNCHitTest(WM uMsg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   場所 Microsoft.Windows.Shell.WindowChromeWorker._WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   場所 System.Windows.Interop.HwndSource.PublicHooksFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   場所 MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   場所 MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
   場所 System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   場所 MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)

Microsoft Windows NT 6.2.9200.0

リンク先を見る限りどうしようもないということなのでしょうか…

karno commented 9 years ago

メモ

WM_NCHITTEST をハンドルする _HandleNCHitTest 内でOverflowExceptionが発生している模様。

同様の事例は他の場所でも報告されており、そこでは以下の様なスタックトレースが提示されている。

System.OverflowException: Arithmetic operation resulted in an overflow.
  at System.IntPtr.ToInt32()
  at Standard.Utility.GET_X_LPARAM(IntPtr lParam)
  at System.Windows.Extensions.WindowChrome._HandleNCHitTest(...

これをもとに調査を行うと、_HandleNCHItTest のコードは http://referencesource.microsoft.com/#PresentationFramework/Framework/System/Windows/Shell/WindowChromeWorker.cs,c02d8cb3abd64f16 GET_X_LPARAMのコードは http://referencesource.microsoft.com/#PresentationFramework/Framework/System/Windows/Standard/Utilities.cs,4f65b43f55dd9c9d そこからさらに潜った IntPtr.ToInt32 のコードは http://referencesource.microsoft.com/#mscorlib/system/intptr.cs,65c5542e5c6d85bb に存在。

IntPtr.ToInt32 の実装を以下に示す:

public unsafe int ToInt32() {
    #if WIN32
        return (int)m_value;
    #else
        long l = (long)m_value;
        return checked((int)l);
    #endif
}

64bit 環境では else 側が実行されるが、ここで long 値(64bit) を checked として int 値(32bit) にキャストしている。checked 指定された演算は、オーバーフロー時に OverflowException をスローする。

つまり、何らかの原因でWM_NCHITTEST時に指定されたLPARAM 値が32bitを超える値となっており、それを32bitにキャストしようとして問題が発生している模様。

回避するには、OverflowException をハンドルするか、 GET_X_LPARAM を

public static int GET_X_LPARAM(IntPtr lParam)
{
    return LOWORD(unchecked((int)lParam.ToInt64()));
}

とかにしてやればいいのかもしれない。

が、フレームワーク内コードなため手が出せず。64bit環境でのみ発現するバグなので、x86向けにビルドすれば起きないらしい。

karno commented 9 years ago

より詳細に分析した結果、修正が行えたかもしれません。

問題が解決したことを確認したいのですが、私の環境で問題が生じないため、 問題が生じていた方にお試しいただきたいと思います。

https://dl.dropboxusercontent.com/u/686809/krile_se_2947r1.zip

上記URLから対策版である Krile StarryEyes 2.9.47 Rev.1 をダウンロードすることができます。 動作は保証できませんが、お試し頂ければ幸いです。

ghost commented 9 years ago

ご対応ありがとうございます。 対策版では報告した操作を行っても問題が起こらなくなりました。12時間ほど起動し続けていますが他の問題が発生しているようにも見えません。

karno commented 9 years ago

2.9.50(StarryBlend)以降で修正済み。