Skip to content

Latest commit

 

History

History
70 lines (45 loc) · 3.09 KB

2022-04-11.md

File metadata and controls

70 lines (45 loc) · 3.09 KB

2022-04-11

さてと。

はい

ただ逆汗・解析を続けるだけだと飽きるから、今日はちょっと趣旨を変えてみる。

ReactOSのデバッグだ。

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);」が失敗する理由を突き止めよ。ソースを変更しても構わない。

この課題が出来たら戦力として認めよう。

今日はここまで。

わかりました

頑張ります


戻る | 次へ