ページへ戻る

+ Links

 印刷 

debug_NASK :: OSASK計画

osaskwiki:debug_NASK

NASKをデバッグするための一発企画ページ

  • for hideyosiさん
  • なんでRed Hatで保護例外が出るのか。これは恥だ。
  • 対象ソースは、win32で作ったpcat版のfdcdrv.nasに限定(限定しないと原因が追求しにくいから)。
Page Top

第一回試験

  • まずgo_0015のnaskのgcc版をwin32で作って、正常に生成できてOSASKがmakeできるかどうかテストしてもらえないでしょうか(MinGWを使う)。最初にmake cleanするといいでしょう。
  • ぐはぁ!! nask はコンパイルはできますが、OSASKをメイクすると、飛んでしまいます!
  • それがうまくいったら、以下に進みます。go_0015のdrv_stdc/boot.cが対象(on Red Hat)。
  • 104行目を次のように書き換えてみる(書き足す)。
	list1 = nask(src0, src1, list0, list0 + MAX_LSTSIZ); exit(0);
    • この場合何も出力されません。問題は例外が起きて終了か、例外が起きずに終了か、そのどちらになるかです。要報告。
  • もし上記で例外が起きなければ104行目を元に戻して、今度は111行目を書き換え(書き足し)。
	tmp1 = LL(list0, list1, tmp0, tmp0 + MAX_TMPSIZ); exit(0);
    • この場合も何も出力されません。問題は例外が起きて終了か、例外が起きずに終了か、そのどちらになるかです。要報告。
  • もし上記で例外が起きなければ111行目を元に戻して、今度は118行目を書き換え(書き足し)。
	dest1 = output(tmp0, tmp1, dest0, dest0 + MAX_BINSIZ, list0, list0 + MAX_LSTSIZ - 2); exit(0);
    • この場合も何も出力されません。問題は例外が起きて終了か、例外が起きずに終了か、そのどちらになるかです。要報告。
    • ここでエラーが起きました。 by hideyosi
  • これらがどういう結果になるかを聞いて、それからまた考えます。お暇なときにでも実験してください。
  • 結果がどうであれ、テストが終わったらソースを元どおりにしておいてください。
Page Top

小柳レポートを当ててみる・・・

  • えーと・・・小柳さん、ご指南感謝です。・・・ですが、私の頭ではちょっと・・(^^;)
  • こういうことでいいんでしょうか?
2490行目         UCHAR *srcp, *file_p, *string0 = NULL, *dest = dest0;


                 ・
                 ・
                 ・
             void put4b(unsigned int i, UCHAR *p)
             {
3812行目       if (p == NULL) return;
                     p[0] =  i        & 0xff;
                 ・
                 ・
                 ・
  • 一応これで、OSASKのコンパイルは通ったのですが・・・・(まだテストしていません)
  • テストしました。Linuxで作ったOSASKは、正常に起動できるようです。(ってことは、この修正であっているのかな??)
Page Top

第二回試験

  • 修正個所は、go_0015のnask.cの2823~2824行目です。
    • 修正前の状態:
	}
	put4b(dest - string0, string0);
    • 修正後の状態:
		put4b(dest - string0, string0);
	}
    • これだけで直ると思いますが、いかがでしょうか?>hideyosiさん
    • この修正をすれば、もちろん小柳さんパッチはいりません。
Page Top

hideyosiさんからのレス欄

  • RedHat上ですが、エラーは、どんなファイルを食わせても起こります。たとえば、 echo -n>aaa.nas nask aaa.nas と、これでもセグメンテーション違反になります。 -- hideyosi 2003-08-21 (木) 15:46:31
  • あ、ちなみに、 ↑ が文法的にあってないのはわかっています。いろんなファイルやなんやらを当ててみて、なにかパターンがないか探していた時の実験です。 -- hideyosi 2003-08-21 (木) 15:47:40
  • また、念のため、改行コードもいろいろ試してみたのですが、変わらないような・・・・ -- hideyosi 2003-08-21 (木) 15:49:15
  • あ!! いけね! 前後しちゃった。Win32まだやってません!!。すぐかかります -- hideyosi 2003-08-21 (木) 15:53:15
  • ちなみに、家ではOSASKをメイクしている場合、飛ぶのは base.nas base.exe base.lst の部分です。(WinでもLinuxでも) -- hideyosi 2003-08-21 (木) 16:14:14
  • win32でも飛びますか・・・。あれえ、じゃあ、うちで飛ばなかったのは僕の思い違いだったのかな。また気が向いたら、win32で実験してみます。 -- K 2003-08-21 (木) 16:20:13
  • とりあえず、outputにバグがあるみたいですね。base.nasで落ちるなら、今後はそれをテストターゲットにしましょう。base.nasの方が短いですから。 -- K 2003-08-21 (木) 16:22:00
  • gdb で追いました。 output() の string0 に値が設定されないまま、put4b(dest-string0, string0)が呼ばれることがあり、put4b()で落ちます。string0 = NULL で初期化して、put4b() の先頭で if (p == NULL) return; とすれば問題がなくなることを確認しました。 -- 小柳 2003-08-21 (木) 18:04:24
  • 小柳さんありがとうございます。たしかに、やばいところを見付けました。これだと確かにOSASKのmakeが失敗するはずです。ということで、訂正箇所を第二試験として書きます。 -- K 2003-08-21 (木) 19:57:48
  • どうもput4bを入れる場所を1行下にしてしまったのが、バグの原因だったようです。>小柳さん、hideyosiさん -- K 2003-08-21 (木) 20:07:48
  • いけました!!! RedHatとWin32、両方とも正常なOSASK(つーか・・・1バイトも違わないのでつが・・・)を生成できました。 -- hideyosi 2003-08-21 (木) 20:22:44
  • (´_ゝ`)キター!!!!感謝!!! -- (´_ゝ`) 2003-08-21 (木) 20:23:55
  • さっとく、GOのページのリニューアルと、Vineでの実験にとりかかります。 -- hideyosi 2003-08-21 (木) 20:24:39
  • 2chで報告したいけどplalaなのでできません。。。 -- (´_ゝ`) 2003-08-21 (木) 20:25:45
  • うわ!! ちょうどかさなった? 顔文字さん、たぶんこれでいけたと思いますよ。 お待たせしました。レポートありがとう! -- hideyosi 2003-08-21 (木) 20:25:54
  • とりあえず、僕は自分の作ったソフトのバグが減ってうれしいです。みなさんご協力ありがとうございました。 -- K 2003-08-21 (木) 20:29:03
  • キター!!!!=>デキター!!!!(hideyosiさんじゃないのにここかいてよかったのかな?(汗 -- (´_ゝ`) 2003-08-21 (木) 20:29:05
  • っていうか、hideyosiさんと顔文字さんは登場頻度が高いので、自己紹介ページを是非作りましょう。そしてmembersに登録。 -- K 2003-08-21 (木) 20:42:46

Last-modified: 2009-11-17 (火) 00:00:00 (JST) (319d) by ゲスト