[Mona] ls/dirでシェルが落ちる件のデバッグ風景2

だめだ・・・。どうしても原因がわからないなぁ。

    static int sendReceive(MessageInfo* dst, dword tid, MessageInfo* info);
    static int sendReceive(MessageInfo* dst, dword tid, dword header, 
         dword arg1 = 0, dword arg2 = 0, dword arg3 = 0, const char* str = NULL);

まさかとは思うが、オーバーロードで別関数を誤ってリンクしているかもしれないので、別名にしてみたが駄目だった。
(´д`;*)くまったなぁ。


あきらめずに別ルートからデバッグ。バグが再現する最小構成コードを探るべくシェルのいたるところをコメントアウトした。コメントアウトするとlsで落ちなくなった。
なのでコメントアウト少しずつ戻していくとあるコードを戻すと落ちることが分かった。

    case COMMAND_UNAME:
        {
             char ver[128];
             syscall_get_kernel_version(ver, 128);
             ver[127] = '\0';
             printf("%s\n", ver);
            break;
        }


ふむ。まずは疑うべきはシステムコールだろう。システムコールの呼び出し先のカーネル側ものぞいたが特に問題点は見当たらなかった。
次に気になったのはchar ver[127];


んん!!!!!!


まさかスタックか?カーネルから与えられている4KBのスタックを突き破っているな。。(突き破ってアクセス権のないメモリ領域にアクセスしようとしてカーネルがShellのスレッドをKILLしたのだ。)
カーネル賢いなぁ(ぉ
まずは127->32に減らすと。うまくいったのでとりあえず127に戻した。
その後カーネルのスレッド生成ルーチンあたりをちょっと変えてスタックを8KBに拡張。
ls/dirで落ちなくなった。


今回の反省点はShellが落ちているアドレスにちゃんと注目しなかったこと。ちゃんと見ればスタックを突き破っていることは一目瞭然だった。
どうもお疲れ様でした。m(__)m


P.S. そのバグを疑ったShell君申し訳ない。




お疲れ様でした。m(__)m