[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から実行したときだけにこれが起こるのも不可解だ・・・