[Mona] ls/dirでシェルが落ちる件のデバッグ風景
Shellの内部コマンドのls/dirをするとShellが落ちる(0xEFFFEFC4でアクセス違反)。まれにカーネルが落ちる?
落ちる箇所はsrc/servers/shell/Shell.cppの460行目あたり
syscall_print("[ls1!]"); printf("%s", (const char*)file); //ここ syscall_print("[ls2!]");
printfの中で落ちるようだ。こりゃまた厄介な場所で落ちているなぁ。
printfデバッグが出来ないじゃん・・・。(´-ω-`)
Monaのprintfはsrc/lib/monapi/syscall.cppで実装されている。
文字列を標準出力担当にメッセージで送信、送信先で画面出力である。
送信先がいない場合はsyscall_printで直接出力である。
しょうがないのでsyscall_printで "."とか"@"とかを埋め込んでデバッグ。
sprintfと組み合わせると事態を複雑にしそうなのでパス。
どうも追っていくとsyscall.cppのint printの
syscall_print("A"); // debug if (tid == THREAD_UNKNOWN || Message::sendReceive(NULL, tid + 1, MSG_PROCESS_STDOUT_DATA, 0, 0, 0, buf) != 0) //ここで落ちている!! { syscall_print("B"); // debug syscall_print(buf); } syscall_print("C"); // debug
sendReceiveの先頭でsyscall_print()しても表示されないので呼び出し自体に失敗している予感。
うーむ。これはお手上げだな・・・。
−Sオプションをつけると
/NO_APP movl _ZZ5printE3tid, %eax cmpl $-1, %eax je L24 movl $0, (%esp) leal -152(%ebp), %esi xorl %ecx, %ecx movl %esi, 24(%esp) xorl %edx, %edx incl %eax movl %ecx, 16(%esp) xorl %ebx, %ebx movl $4338, %esi movl %ebx, 20(%esp) movl %edx, 12(%esp) movl %esi, 8(%esp) movl %eax, 4(%esp) call __ZN6MonAPI7Message11sendReceiveEP11MessageInfojjjjjPKc testl %eax, %eax je L23 L24: movl $LC6, %edx movl %edx, -200(%ebp)
ふーむ。Shellから実行したときだけにこれが起こるのも不可解だ・・・