Chrome の上位バージョンで Windows 2000が即時クラッシュする理由を調査
Windows 2000 で Chrome 51 な度の上位バージョンを動作させると起動させる前にクラッシュするので調査してみました。
でも、なぜかデバッガ上で動かすとクラッシュしない…
という訳で、トレース!
SUB_L00422A80: call SUB_L00426700 test al,al jnz L00422A8B int3 retn |
これが原因ポイ?
chromium/src/base//logging.h
#if defined(__clang__) #define IMMEDIATE_CRASH() ({__asm int 3 __asm ud2 __asm push __COUNTER__}) #else #define IMMEDIATE_CRASH() __debugbreak() #endif // __clang__ #if defined(OFFICIAL_BUILD) && defined(NDEBUG) |
これっぽい感じ
直前のログ
[0823/102747:FATAL:scoped_handle.cc(184)] Check failed: 0U != (flags & 0x00000002) (0 vs. 0) |
void ActiveVerifier::StartTracking(HANDLE handle, const void* owner, const void* pc1, const void* pc2) { if (!enabled_) return; // Grab the thread id before the lock. DWORD thread_id = GetCurrentThreadId(); AutoNativeLock lock(*lock_); Info handle_info = { owner, pc1, pc2, base::debug::StackTrace(), thread_id }; std::pair<HANDLE, Info> item(handle, handle_info); std::pair<HandleMap::iterator, bool> result = map_.insert(item); if (!result.second) { Info other = result.first->second; base::debug::Alias(&other); base::debug::Alias(&creation_stack_); CHECK(false); // Attempt to start tracking already tracked handle. } } |
これに近いように見える
Windows 7などで見てみた所、そもそも、こんな処理のスレッドに飛んでこないようだ ・ω・;
という訳で、対策は int3 を nopでつぶすくらいしか対策が無さそう
FIX: a packed application built using atom/electron framework crashes with output: "[384:0112/143143:FATAL:scoped_handle.cc(184)] Check failed: 0U != (flags & 0x00000002) (0 vs. 0)" |
ググったらこんなのあった
とりあえず、バイナリエディタで
84C07502CCC3 を見つけたら C3907502C3C3 に書き換えてよさそう ・ω・
Comments