Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调试大型双数组 < >我使用C++库,为简单起见,提供了一个对象,或多或少类似于: class ExampleSO { public double* narray; }; #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 }_C++_C_Debugging - Fatal编程技术网

调试大型双数组 < >我使用C++库,为简单起见,提供了一个对象,或多或少类似于: class ExampleSO { public double* narray; }; #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 }

调试大型双数组 < >我使用C++库,为简单起见,提供了一个对象,或多或少类似于: class ExampleSO { public double* narray; }; #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 },c++,c,debugging,C++,C,Debugging,我有一个ExampleSO的例子,它的narray大约是200。其他一些方法ExampleSO::method()对该数组执行许多算术函数,并将其分配给不同的数组元素: ExampleSO::method() { // a lot of operations narray[50] = narray[1] * narray[2] / narray[40]; // and so on 此代码由另一个程序生成,它使用一组定义来处理数组元素,因此代码如下所示: class

我有一个
ExampleSO
的例子,它的
narray
大约是200。其他一些方法
ExampleSO::method()
对该数组执行许多算术函数,并将其分配给不同的数组元素:

ExampleSO::method() {
     // a lot of operations
     narray[50] = narray[1] * narray[2] / narray[40];
     // and so on
此代码由另一个程序生成,它使用一组定义来处理数组元素,因此代码如下所示:

class ExampleSO {
    public double* narray;
};
#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之间)的幂运算引起的

在我对gdb魔术了解不多的情况下,我设法通过
display*(this->narray)@200
来查看数组元素,但是这个数组非常大,因此无法读取

因此,调试这段代码已经变成了一项非常麻烦的任务,因为
#定义了
隐藏了元素的位置,数组太大了,而且因为太多元素变成了NaN,所以我丢失了

我的问题是:你有什么想法/建议来帮助我调试这段代码?当第一个数组元素变为NaN时,使用条件断点可能有用吗?这样的结构我怎么能做到呢

谢谢

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

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


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

    X、Y、Z宏将以这种方式解析,您将看到实际的索引。如何调用预处理器本身取决于编译器。对于gcc,它是cpp命令


    关于确定何时分配NaN,应该有一个编译器开关,当发生异常时,该开关将使程序抛出异常。

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

    X、Y、Z宏将以这种方式解析,您将看到实际的索引。如何调用预处理器本身取决于编译器。对于gcc,它是cpp命令


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

    如果需要调试宏调用生成的大量代码,并且无法重构以删除宏,一个选项是临时预处理文件,复制宏生成的代码并将其粘贴到宏调用上。然后,您将能够编译已经预处理的代码并进行适当的调试。完成后,只需还原代码。

    如果需要调试宏调用生成的大量代码,并且无法重构以删除宏,一个选项是临时预处理文件,复制宏生成的代码并将其粘贴到宏调用上。然后,您将能够编译已经预处理的代码并进行适当的调试。完成后,只需还原代码。

    否没有编译器开关。这是一系列库函数。gcc的-fsignaling-nans呢?不管怎样,我都要试一试。嗯,-F给南斯发信号不起作用_mm_setcsr/feenableexcept是解决问题的方法,没有编译器开关。这是一系列库函数。gcc的-fsignaling-nans呢?不管怎样,我都要试一试。嗯,-F给南斯发信号不起作用_mm_setcsr/feenableexcept是goI无法重写它的方式,因为代码是由程序生成的,而不是由我生成的。代码生成器也不是我的,但我将听取关于如何轻松管理许多存储在数组中的双变量(如本例所示)的任何建议+1对于信号NAN,我将从它开始,它消除了选项1,但不是2、3或4。5.无论如何,我一定会帮你的。找到我的错误了。谢谢你的想法。5是最有用的,在将来无论如何都要实现2。我不能重写它,因为代码是由程序生成的,而不是我。代码生成器也不是我的,但我将听取关于如何轻松管理许多存储在数组中的双变量(如本例所示)的任何建议+1对于信号NAN,我将从它开始,它消除了选项1,但不是2、3或4。5.无论如何,我一定会帮你的。找到我的错误了。谢谢你的想法。5是最有用的,不管怎么说,在未来都会实现2。