メモリ破壊

動作不調の原因、どうやらヒープ破壊が原因らしいことがわかった。
SQLite内でmallocする際にヒープが壊れていて落ちているらしい。


gwes.exeをデバッグ版に変えてみたところ、GWES内で例外が発生していることが判明。

ERROR: c:\macallan\private\winceos\coreos\gwe\gwe\gwe_s.cpp line 1199:
An exception occurred in GWE at xxxxxxxx.

該当箇所(gwe_s.cpp line 1199)はGWESの例外ハンドラ。


gwes.exeのバイナリをいじってGWESの例外ハンドラをつぶしたところ、例外発生時のスタックが取れた。

coredll.dll!FindFreeItemInRegion
coredll.dll!Int_HeapAlloc
coredll.dll!LocalAlloc
coredll.dll!_nh_malloc
coredll.dll!malloc
cmdb.exe!sqlite3Malloc
cmdb.exe!sqlite3Realloc
cmdb.exe!resizeOpArray
cmdb.exe!sqlite3VdbeAddOp
cmdb.exe!sqlite3CodeVerifySchema
cmdb.exe!sqlite3BeginWriteOperation
cmdb.exe!sqlite3Insert
cmdb.exe!yy_reduce
cmdb.exe!sqlite3Parser
cmdb.exe!sqlite3RunParser
cmdb.exe!sqlite3_prepare
cmdb.exe!sqlite3_prepare16
cmdb.exe!SQLiteExecSql
cmdb.exe!FlushFavoriteItems
cmdb.exe!CMDBWndProc
coredll.dll!PerformCallBack4
gwes.exe!WindowProcCallback
gwes.exe!CWindow::CallWindowProcWInternal
gwes.exe!MsgQueue::SendMEssageWithOptions
gwes.exe!MsgQueue::SendMessageW_I
coredll.dll!DoSendMessageWInGwe
coredll.dll!SendMessageW
cmdb.exe!CMDBWndFuncRight
cmdb.exe!CMDBWndProc
coredll.dll!PerformCallBack4
gwes.exe!WindowProcCallback
gwes.exe!CWindow::CallWindowProcWInternal
gwes.exe!MsgQueue::SendMessageW_I
coredll.dll!DispatchMessageW
cmdb.exe!WinMain
cmdb.exe!WinMainCRTStartup
coredll.dll!MainThreadBaseFunc

SQLite内のmallocの先のLocalAlloc内で死んでる。どうやらヒープの管理領域がぶっ壊れてるようだ。


デフォルトのプロセスヒープ(GetProcessHeap)を使っていたところを、切り分けのため別ヒープに分離してみたところSQLiteでは落ちずに、自分のルーチン内で落ちるようになったので、どうやら自分の中のヒープを壊してるようだ…(やはり実績もある人様のソースを簡単に疑うものではないね。まず自分を疑え、と)


いろいろやってみたが今日は原因箇所特定できず。
オーバーラン検出用に仕込み入れるか…


ちなみにOSが不安定になってた原因は、GWES内の状態が不定になってた可能性がある。GWESはロードしてすぐに自分用に例外ハンドラをセットしている。基本的にウィンドウベースのプログラムなのでメッセージループから始まるGWESスタックの深いところで動作しているため、プログラム内での例外もGWESの例外ハンドラに横取りされてたらしい。で、とんでもないところからGWESの例外ハンドラに飛んでくるため、GWESの状態がおかしなことになっていた…と考えるのが辻褄がなんとなく合いそう。