none
巨大配列のデバッグ RRS feed

  • 質問

  • MByte 以上のサイズの配列に正しい値が入っているのかチェックするのに、ファイルに値を書き出して、ExelとかMathematicaとかでグラフ表示してます。

    ファイル書き出しするには、自分でコードを挿入するしかないのでしょうか?これでは、printfデバッグならぬfprintfデバッグになります。

    ブレークポイントで止めて、「指定した配列をファイルに書き出し」なんていう機能はありませんか?

    (なければ、次期バージョンに付けて欲しいです)

    2006年8月5日 2:07

すべての返信

  • KanPro さん、こんにちは。

     KanPro さんからの引用
    ブレークポイントで止めて、「指定した配列をファイルに書き出し」なんていう機能はありませんか?
    (なければ、次期バージョンに付けて欲しいです)

    for で書き出すくらい、面倒ではないのであまり問題になった験しがありません。
    たとえば、コード スニペットで貼り付けて、TestMethod を実行などなど。

    2006年8月5日 3:25
  • アンマネージな配列であれば、[メモリ]ウィンドウを使えばよいのでは?

    デバッグ中にメニューの[デバッグ]→[ウィンドウ]→[メモリ]→[メモリ(1)]

    でウィンドウを出現させれます。
    で、メモリウィンドウで矩形選択してコピペすればある程度楽になると思います。

    2006年8月5日 3:32
  •  KanPro さんからの引用

    ブレークポイントで止めて、「指定した配列をファイルに書き出し」なんていう機能はありませんか?


    配列のデータをどのように書き出すかは KanPro さんにしかわからないと思います。
    また、実際にファイルに書き出さなくてもいいのなら、
    自動テストで値をテストするって言うのもありますよね。
    2006年8月5日 9:22
  • 標準では存在しないし,今後も追加される可能性は少ないかと思います.
    ただ,試したことはないですが,Debugger Visualizer を自作することで何とかなるかもしれません.
    (.NET の配列型は実行時合成型なので,実際試してみないとうまく行くかどうかは分からない点がありますけど)

    また,最近の Mathematica は .NET/Link という .NET 連係機能が標準で装備されています.この機能を使えば,Debugger Visualizer 上で Mathematica のグラフ表示というのもできなくはないかもしれません.
    (こちらの機能もほとんど使ったことがないので,うまく行くかどうかは保証できませんけど)

    以上ご参考までに.

    追記: .NET 開発と Native 開発ではまた話が違ってくるのでご注意下さい.上の話は .NET 開発を想定しています.

    追記2: 配列を dump するメソッドを作って,ブレークポイントで停止後にイミディエイトウィンドウから直接実行する,でもいいかもしれませんね.

    2006年8月5日 10:15
  • 短時間の内に色々なコメントを頂きありがとうございます。

    NyaRuRuさんの追記2の方策が使えそうな気がしますので、調べてみます。

    サイズを抑えて単体テストを行うことはできるのですが、本番のサイズでテストすることは困難なのです。正確な答えがわかっている訳でもないので...しかし、計算精度のチェックはサイズを抑えて行うのは無理があるのです。

    C++でNativeコードを生成させるソフトなのですが、配列の中身はdoubleかfloat  ですので、単にBinaryでファイルに吐き出してくれれば良いのですが、あまり同じ悩みを経験された方はいらっしゃらないようですね。

     

    2006年8月5日 15:19
  • 報告です。

    下記のコードを挿入しておくことで、ブレークポイントで止めた後、

    イミディエトウィンドウから、疑念のある配列の値をファイルに落とせるようになりました。

    NyaRuRu さん始め、皆さんありがとうございました。

    #ifndef NDEBUG
    #include <fstream>

    void DebugDump(const char* DumpFile, double* Val, int Size)
    {
    std::ofstream Dump(DumpFile, std::ios::binary);
    const char* Buf = reinterpret_cast<const char*>(Val);

    Dump.write(Buf, sizeof(double)*Size);
    }
    #endif // NDEBUG

    2006年8月7日 10:23