代码之家  ›  专栏  ›  技术社区  ›  YuppieNetworking

调试大型双数组

  •  0
  • YuppieNetworking  · 技术社区  · 16 年前

    我使用C++库提供了一个对象,为了简单起见,它或多或少类似于这样:

    class ExampleSO {
        public double* narray;
    };
    

    ExampleSO 谁的 narray 大约是200。还有别的方法吗 ExampleSO::method() 使用此数组执行许多算术函数,并将其分配给不同的数组元素:

    ExampleSO::method() {
         // a lot of operations
         narray[50] = narray[1] * narray[2] / narray[40];
         // and so on
    

    #define A narray[0]
    #define X narray[1]
    #define Y narray[2]
    // ...
    #define Z narray[40]
    // ....
    #define U narray[50]
    // ... more, until narray[199]
    ExampleSO::method() {
         // a lot of operations
         U = X * Y / Z;
         // and so on
    }
    

    我的问题是,最终一些数组元素是NaN,我正在尝试调试代码以了解原因。我已经发现其中一些主要是由零除引起的,另一些是由非常小的数字(小到介于0和+/-0.1之间)的幂运算引起的。

    display *(this->narray) @ 200 ,但此数组非常大,因此无法读取。

    因此,调试这段代码已成为一项艰巨的任务,因为 #defines 隐藏元素的位置,数组太大了,因为太多元素变成了NaN,所以我迷失了方向。

    谢谢

    3 回复  |  直到 16 年前
        1
  •  4
  •   bmargulies    16 年前
    1. 重写它。你所描述的结构令人难以形容。
    2. 编写一个python脚本,将#defines转换为gdb变量别名,以便可以象征性地引用它们。
    3. 在gdb:p中使用数组语法 narray[12]
    4. 添加一些调试助手函数并从调试器调用它们: p printMyFavoriteValues(narray)
    5. 了解如何启用信令NAN。它在Windows、Mac和Linux上是不同的。


    #ifdef DARWIN
        _mm_setcsr( _MM_MASK_MASK &~
                  (_MM_MASK_OVERFLOW|_MM_MASK_INVALID|_MM_MASK_DIV_ZERO) );
    #else
        feenableexcept(FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW | FE_INVALID);
    #endif
    
        2
  •  1
  •   Maximilian    16 年前

    关于定义,您可以通过预处理器运行文件,然后编译和调试预处理文件本身。

    Documentation .

    关于找出NaN何时被分配,应该有一个编译器开关,当发生这种情况时,它会使程序抛出异常。

        3
  •  0
  •   JoeG    16 年前