パスワードを忘れた? アカウント作成
11810 story
ソフトウェア

バグを発見する典型的なやり方ってありますか? 237

ストーリー by yoosee
まず再現方法を教えてください… 部門より

あるAnonymous Coward曰く、"Mu: 経由で、「w3mのデバッグの記録」というのを読んだ。

w3mのバグを修正した時の記録です。バグ修正のケーススタディ的な物があると有用かなと思ったので、公開します。

バグの発見方法
* なにはともあれ、ktrace
* fstatでオープンしているファイルの状態を見る
* w3mのソースからgzipの処理部を探す
* pcloseが呼ばれているのかを検証
* pcloseではクローズできないpipeがある?
* pipeをオープンする方法は、popenだけではない
時々、じっとログを眺めていたかと思うと「キター」とかいってバグを発見するヒトもいるのですが、みなさんはバグを発見するための定石などありますか?聞いてみたいです。"

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • who (スコア:5, すばらしい洞察)

    by Anonymous Coward on 2006年02月09日 13時01分 (#880380)
    誰が書いたかを見る
  • by visha (779) on 2006年02月09日 13時15分 (#880392) 日記

    何が起こっているのか正確に把握するってのが一番大事。coreだのktraceだfstatだってのもそのための道具な訳で。「よくわからないんでそれらしいところをいじったら直りました」ってのは最悪。「そりゃ症状が消えただけだろ!! 直ったかどうかなんてわからないだろ!!」とよく怒鳴ったものです。

  • 一番の方法は (スコア:5, すばらしい洞察)

    by Anonymous Coward on 2006年02月09日 13時18分 (#880394)
    一晩ぐっすり寝た後で、ログを読み返す。


    #それができれば苦労はしないですけど…
  • by quaternion (18655) on 2006年02月09日 13時23分 (#880400) 日記
    同僚にコードを見せつつ「これこれこういうことをしようとしているんだけどね」と説明する(同僚はただ座っているだけでよい).自然とバグが見つかる.
    • by fioro (3533) on 2006年02月09日 15時10分 (#880486)
      どこで読んだか忘れたのですが、あるアメリカの大学の一般学生向け計算機センターの事務室では、質問受付のクマさんのぬいぐるみが置いてあるそうです。
      何か不具合や質問があったとき、事務員に聞く前にまずこのクマさんに一度話してからでないといけないとか。

      で、質問者の半数はクマさんが解決してくれるそうです。

      #ネタ元なんだったっけ、なにか有名な話のような気も
      親コメント
    • Re:告白違い (スコア:4, おもしろおかしい)

      by sakuya-m (14007) on 2006年02月09日 13時36分 (#880407) 日記
      「これこれこういうことをしようとしているんだけど・・・
       ・・・あんたのためにやってるんじゃないんだからね!!」

      これでモチベーションもアップ。
      #する人としない人、どっちが多いだろう。
      --
      ---にょろ~ん
      親コメント
      • Re:告白違い (スコア:4, おもしろおかしい)

        by sakuya-m (14007) on 2006年02月09日 15時06分 (#880484) 日記
        これには重大なバグがありました。

        自分で言っても萌えませんorz

        修正版。
        自分「これこれこういうことをしようとしているんだけど・・・」
        相手「なんで私が見なくちゃ行けないのよ。
           ・・・あんたのためにやってるんじゃないんだからね!!」
        --
        ---にょろ~ん
        親コメント
    • Re:告白デバッグ (スコア:3, おもしろおかしい)

      by miyachi-y (28238) on 2006年02月09日 13時27分 (#880401) 日記
       その場合、同僚は、アヒル隊長 [pilot-toy.com]でも可。
      親コメント
      • Re:告白デバッグ (スコア:4, おもしろおかしい)

        by Anonymous Coward on 2006年02月09日 21時33分 (#880674)
        何年も前、バグの原因が見つからず煮詰まってたとき、同じようなことを
        「聞いてアロエリーナ、ちょっと言いにくいんだけど~」
        と(確かサーバラックに)言ってたら、近くの人に本気で心配されました。

        # ちょっとしたお茶目のつもりだったんだけど。
        親コメント
    • Re:告白デバッグ (スコア:3, 参考になる)

      by nenoneno (28388) on 2006年02月09日 13時43分 (#880419) 日記
      そういう経験(結構)ありました。「なるほど」と、大仏になってくれていた同僚に感謝。
      自分のbugも去る事ながら、仕様の矛盾点まで露呈してしまい、bugだか仕様だか、もめた事数知れず。

      #bugをトレースするプログラムを書いて、そいつにbugがあって...以下循環参照orz
      親コメント
    • Re:告白デバッグ (スコア:3, すばらしい洞察)

      わかる。自分で言葉にして説明してみることって、重要よね。それだけでかなりの情報を自分の頭の中で整理することができる。

      プログラミングに限った話じゃないけど。

      --
      むらちより/あい/をこめて。
      親コメント
      • by Anonymous Coward on 2006年02月09日 15時01分 (#880483)
        新人研修のプログラミング実習の講師にあたったとき、まさにソレを教える時間がありました。まぁ「レビューの重要性」というもっともらしいタイトルがついていましたが。

        暗い顔で説明している新人の表情がパァっと明るくなっていくのがとても快感でした。

        講師すら外れて久しいのでAC
        親コメント
  • リリースする (スコア:5, おもしろおかしい)

    by Anonymous Coward on 2006年02月09日 13時35分 (#880406)
    これにまさるバグ発見手段は他にないな

    #発見できても逃げられる=二度と再現できない場合が多々あるのが璧に傷
  • by Anonymous Coward on 2006年02月09日 13時56分 (#880434)
    会社を出て地下鉄の入り口で原因に気付く。
  • by Anonymous Coward on 2006年02月09日 15時55分 (#880514)

    まだ紹介されていないようなので。

    「デバッグパターン」 [fc2web.com]

    このストーリーで紹介された手法のかなりの部分が、ここですでに網羅されています。

    中でも身につまされたのが、これ。

    名称:PhenomenonDebug アンチパターン
    別名: 対処療法アンチパターン、もぐら叩きアンチパターン
    例: 「ここの関数に来る値がときどき一文字欠けているんだ。欠けている文字が何か推測するプログラムを書くのに苦労したよ。」
    分類: 3.プログラマのバグ
    現象: プログラムの現象に対する修正を行う。
    原因: 現象はなぜ起こったのかという原因を修正せずに、その現象に対する修正を行ってしまう。
    対策: 原因に対する修正を行う。ある関数に必ず2倍の値が入ってくるのならば、入ってきた値を1/2にするのではなく、2倍の値が入ってくる原因を修正する。
    例外: 原因を自分が触れることができない場合はその限りではない。が、後の人のために必ずコメントを入れておかねばならない。
    補足: このアンチパターンを行うプログラマは転職を真剣に考えるべき。というか消えてください。

    (末尾の強調は引用者による)

    • Re:デバッグパターン (スコア:3, おもしろおかしい)

      by minz (3213) on 2006年02月09日 18時51分 (#880604) ホームページ 日記
      もう20年も前ですが、実際に見た事があります。
              c = c / 2; /* 答えが倍になるため */
      ってソースをスタッフが書いてました orz
      で、そいつは
              a = b + 1;
              a = b + 1; /* 念のため。たまに答えがおかしいので */
      ってコードも書いてました orz
      --
      みんつ
      親コメント
  • by cljack (22418) on 2006年02月09日 16時42分 (#880534)
    静的解析ツールはそこそこ役に立つ.
    FindBugs [sourceforge.net]
    PMD [sourceforge.net]
    Lint4j [jutils.com]
    codewizard [techmatrix.co.jp]
    DevPartner Studio Professional Edition [compuware.co.jp]
    COReTOOL/PGRelief [fujitsu.com]
    QAC [toyo.co.jp]
    QAC++ [toyo.co.jp]
    などなど…
    C/C++向けで自由にルールが作成できるオープンソースの実装は無いものか.
  • valgrind (スコア:4, 参考になる)

    by metamo (12497) on 2006年02月09日 13時32分 (#880404)
    ちゃんと動いててもとりあえずvalgrindでチェックしてみます。 意外なところでメモリリークしてたりします。
  • by TarZ (28055) on 2006年02月09日 14時10分 (#880448) 日記
    1. コンピューター本体表面のパネルを開き、鱗粉まみれになっているリレーがないか確認します。
    2. バグを取り除き、接点を掃除します。
    3. パネルを閉じ、コンピューターの動作を確認します。
  • by Anonymous Coward on 2006年02月09日 13時02分 (#880383)
    で大きく話が違ってくると思うのですが。
  • 寝バッグ (スコア:3, 参考になる)

    by taka2 (14791) on 2006年02月09日 13時42分 (#880417) ホームページ 日記
    時々、夢の中でバグの原因を発見することがあります。
    目覚めてから確認すると、そのものずばりだったり。
    (全然見当はずれな内容だったり、既に修正済のバグについて必死で原因を探す夢だったりすることも…)

    まあ、昼間ずっと考えていた内容が、寝ている間に整理されてるのだと思っていますが、

    デバッガでコードを一行ずつトレース実行しつつ、監視式を表示して確認し、
    「ここだっ、ここでバグってる!」って感じでバグを見つけるという夢を見たことも。
    それで正解だったのですが、私の脳はCPUのエミュレーション機能を持っているのかどうか不思議です…
  • assert(3) (スコア:3, 興味深い)

    by ef (25263) on 2006年02月09日 15時37分 (#880501)
    それらしい場所が絞り込めたらと言う事になりますが、assert(3) を怪しげな変数の値や、来るはずのない else や default に追加してます。assert を踏んでくれれば後はダンプされてコアのスタックフレームをバックトレースして原因を特定。

    assert はソースに残しておいても -DNDEBUG でリリース版ではコード生成させないで済むし、書き手が何を「ありえない状態」と仮定しているがソースに残ってドキュメント性もちょっと上がります。

    あと、どうやってコード上の異常な場所まで来たかはカバレジテスタやプロファイラを使って調べる事もあります。

  • by textoyx (29735) on 2006年02月09日 17時10分 (#880549) ホームページ 日記
    バグの発見方法
    * ソースリストプリントアウト
    * 髪の毛にクリップを結びつける
    * 1ページずつ髪の毛の先にぶら下げたクリップをかざす
    * 反応したページを抽出
    * 一行ずつクリップをかざす
    * 反応した行に注目

    ええ、もちろん最終手段ですよ。もう、なにがなんだかワカラン!いっそ殺してくれ!オレを殺してくれ!ってなマトモじゃない精神状態ですよ。一回だけですよ!もうしませんよ!許してください…。
    でも解決したよ(笑)
  • by Anonymous Coward on 2006年02月09日 18時51分 (#880602)
    コンピューターの初心者かそのソフトウェアにまだふれたことがない人に操作してもらう。

    これでけっこうバグが見つかります。
    ただし、どう操作してバグが出たのかを説明するスキルはないので、
    同席して操作をきっちり見張る必要があります。
  • by Dai Sato (12729) on 2006年02月09日 22時07分 (#880701) ホームページ
    このスレッドの本題からはそれますが、問題の pclose を fclose に修正しました。情報提供に感謝します。
    # 他にも未反映の patch が溜まってるんですが…
  • もちろん (スコア:2, 興味深い)

    by Another_View (29838) on 2006年02月09日 13時17分 (#880393) ホームページ 日記
    いまでもprintf(またはその類)を愛用。
    デバグ完了後も消さないので、コメントアウトされたprintfの類がたくさん残ります。

    はいはい、言わなくてもわかってるよ。けど、そのprintfの山を見てるのも好きなんだよね。戦績ってかんじか?
    • Re:もちろん (スコア:5, 興味深い)

      by Le Coq Emperor (924) on 2006年02月09日 13時58分 (#880439) ホームページ
      その昔…この業界に入って最初の頃に出会ったバグで…

      デバッグオプション付きでコンパイル →正常に動く
      最適化オプション付きでコンパイル →異常動作
      最適化オプション付きでprintf埋め込んでコンパイル →正常に動く

      ってのがありました。

      原因はある変数の初期化漏れで、printf埋め込みで運良く初期化されてしまうのがこのような現象を引き起こしてました…
      #最近のコンパイラなら「初期化されてないぞー」って騒がれるとこだとおもいますが、アノ頃はそんなものはなかった…

      いぁほんとに悩みましたこれ…ダミーのprintf残したままテスト終了にしようと何度思ったことか…
      親コメント
    • Re:もちろん (スコア:3, 参考になる)

      by harupunte (10435) on 2006年02月09日 14時19分 (#880451) 日記
      私もprintfな人ですが、
      決められた処理時間(ms)内にAckを返さないと行けない
      処理の中でprintf使って、
      「なんで正常に動かないんだろぉ~」とハマった事が
      あります。printfって遅いのね・・・・・・。

      デバグの為にバグ生んで何やってんだかと。
      親コメント
  • 人柱。 (スコア:2, おもしろおかしい)

    by 2nd.cc (28719) on 2006年02月09日 13時38分 (#880412) ホームページ 日記
    とにかく使わせてみる(汗
    大規模なシステムでは使えないケド。
  • ■自分で作ったものの場合
    • そのプログラムでやろうとしていることを、さらに小さなパーツの組み合わせに分解する。
    • 手続きフローで考えているところをデータフローに変える。
    • 中間状態をメモリに格納したままにしない。とにかくテキストに変換してファイルに書き出す。
    • 手動で再現してみる。

    ■他人が作ったものの場合
    むしろコンパイルできなくって困ること
    (つまり configure.in, Makefile.in のバグ)のほうが
    多いんだけど。

    非x86Linuxの環境を使っている方はどーですか。そんなことないですか。
    CFLAGS や LDFLAGS を無視する Makefile.in を見ると
    腹が立ってきたりしませんかそうですか。
    --
    # mishimaは本田透先生を熱烈に応援しています
  • by 505 (12538) on 2006年02月09日 15時12分 (#880487)
    私はシミュレーションしない人(を!)なので、シーケンサの値や重要な信号を
    未使用I/Oピンに出力させておいて、ロジアナで信号波形観測です!

    まずこいつが“L”で、こっちが“H”で、その2クロック後にこの信号が…
    ん…ここが動いてないところか…
    (で、ソースの該当部分をよく見る…)

    あ、ごめん、ステートマシンの飛び先ステート値、間違ってました(^^;)

    え? ハードウェアな人はお呼びでない? 失礼しました…
    (HDLはほとんどソフト感覚なんですが^^;)
typodupeerror

ソースを見ろ -- ある4桁UID

読み込み中...