我有特殊问题。我正在与其他人的库(GPc)一起工作并且存在一些问题所以我想调试它。似乎一个简单的getter返回了一个错误的数字。我在吸气器里面放了一个完整性检查印刷品,它也失败了。吸气剂是:
unsigned int getNumData() const {
std::cout << "nData = " << nData << "\n";
return nData;
}
看起来微不足道,没有什么可能出错的。但是,当我运行它时,它会打印并返回错误的数字。我尝试用gdb调试它,看到结果:
CGaussianNoise::initStoreage (this=0x7fffffffd2b0) at CNoise.cpp:313
313 int m = getNumData();
(gdb) s
CNoise::getNumData (this=0x7fffffffd2b0) at CNoise.h:161
161 std::cout << "nData = " << nData << "\n";
(gdb) p nData
$44 = 500
(gdb) n
nData = 0
162 return nData;
(gdb) n
163 }
(gdb)
CGaussianNoise::initStoreage (this=0x7fffffffd2b0) at CNoise.cpp:314
314 int n = getOutputDim();
(gdb) p m
$45 = 0
(gdb) p nData
$46 = 500
nData的预期值(根据输入)是500.当我在getter开头的gdb中打印它时,似乎没问题。但是使用std :: cout的子序列打印输出为零。并且返回的值也是零......这怎么可能?
编辑:调用的回溯日志:
#0 CNoise::getNumData (this=0x7fffffffd2b0) at CNoise.h:161
#1 0x00000000004448ce in CGaussianNoise::initStoreage (this=0x7fffffffd2b0) at CNoise.cpp:313
#2 0x0000000000415bdc in CNoise::setTarget (this=0x7fffffffd2b0, vals=0x7fffffffd5c0)
at CNoise.h:194
#3 0x0000000000415cad in CGaussianNoise::CGaussianNoise (this=0x7fffffffd2b0, pyin=0x7fffffffd5c0)
at CNoise.h:320
#4 0x0000000000407fbc in CClgp::learn (this=0x7fffffffded0) at gp.cpp:369
#5 0x00000000004047cb in main (argc=8, argv=0x7fffffffe178) at gp.cpp:39
Edit2:我尝试在存储nData
的内存上设置一个rwatch,显然它已经设置但从未读过:
(gdb) info break
Num Type Disp Enb Address What
...
9 read watchpoint keep y *0x7fffffffd420
10 hw watchpoint keep y *0x7fffffffd420
breakpoint already hit 1 time
答案 0 :(得分:1)
我仍然不确定问题是什么,但这似乎与它有关:Calling virtual functions inside constructors。在我清除了CGaussianNoise
构造函数中对虚方法的所有调用并将代码直接移到内部(虽然丑陋的代码重复)之后,它停止了做这些奇怪的事情......
第二种可能的解释是,由于项目的Makefile存在一些问题,其中一个源文件是针对不同的库编译的,将它们链接在一起时存在一些冲突,可能是内存冲突。