さてと。
はい
ただ逆汗・解析を続けるだけだと飽きるから、今日はちょっと趣旨を変えてみる。
ReactOSのデバッグだ。
ReactOSのkdbは貧弱なデバッガなので、本格的にデバッグしようとすると工夫が必要になる。 katahiromz/reactos-kdb-cheatsheetを参照。
デバッグ中に「bt」コマンドを実行するとバックトレース(呼び出し履歴)が取れる。
デバッグに入っていないときはTab+Kで強制的にデバッグに入れる。 ユーザー側の例外で停止したい場合は「set condition * first always」を事前に実行しておく。 ステップ実行したいときは、「step」コマンドを使う。 デバッグを止めて通常実行に戻るときは、「cont」コマンドを使う。
カーネル側で「ASSERT(式);」が失敗したとき、
*** Assertion failed: (式)
*** Source File: win32ss/user/ntuser/?????.c, line ???
Break repeatedly, break Once, Ignore, terminate Process or terminate Thread (boipt)?
kdb:>
などと表示される。このとき、b、o、i、p、tのいずれかを入力する訳だが、bを押した後、Enterキーを押すとデバッグに入れる。
さて、問題はimm32_apitestのhimcテストケースの「hIMC = ImmGetContext(NULL);」が失敗していることだ。 原因を調べるために、本格的に本丸に乗り込んでいこう。
katahiromz/ImeStudy/ARTICLES
のhello20にパッチファイルdebug-patch.patchがある。これはソースコードの変更点(差分)を表したもので、
reactosを変更した後、「git diff > debug-patch.patch」で取得したものだ。
このパッチは、reactosのある場所で、「git apply debug-patch.patch」などと実行すると、変更点が適用される。
ローカルリポジトリのreactosを最新に更新(git checkout .; git checkout master; git fetch upstream; git rebase upstream/master)し、 テキストエディタで「debug-patch.patch」を開いて変更点を確認した後、reactosに適用しよう。
まず、ImmGetSaveContextはImmGetContextから呼ばれる関数だったね。 パッチにより、ImmGetSaveContextにERRマクロでいくつかデバッグ出力が追加される。 これでImmGetContextの戻り値がNULLになる理由が少しわかる。
dumpImcListという関数が追加されている。 これはpti->spDefaultImcのリストの中身をデバッグ出力する関数だ。 これでpti->spDefaultImcの内容が確認できる。
modules/rostests/apitests/imm32/himc.cにも変更点があって、 関数ポインタのprintfとDebugBreak();が追加されている。
【課題】 debug-patch.patchとkdbを使ってimm32_apitestのhimcテストケースの 「hIMC = ImmGetContext(NULL);」が失敗する理由を突き止めよ。ソースを変更しても構わない。
この課題が出来たら戦力として認めよう。
今日はここまで。
わかりました
頑張ります