C++ c++;loop在centOS7上错误跳出?
我有一个项目,编译后在ubuntu上运行良好,代码片段如下:C++ c++;loop在centOS7上错误跳出?,c++,loops,centos,gdb,C++,Loops,Centos,Gdb,我有一个项目,编译后在ubuntu上运行良好,代码片段如下: void Backtest::start() { std::cout << "start !!" << std::endl; std::cout << bars.size()<< std::endl; int jj=0; while(jj<bars.size()){ std::cout << "on bar " &
void Backtest::start()
{
std::cout << "start !!" << std::endl;
std::cout << bars.size()<< std::endl;
int jj=0;
while(jj<bars.size()){
std::cout << "on bar " << jj<<std::endl;
newBar(&bars[jj]);
jj++;
}
}
PS NeWar是项目中的其他东西,它基本上是调用一个策略性的东西来做的,这将调用一个增强型Python模块来调用C++函数(它给Python提供了一些API,包括GETCASH(),这就是为什么它在调试信息中打印出来)在
获取现金之后打印jj
的值会很有趣
我的水晶球说它会有一个非常大的正值或负值,在这种情况下,您的问题是newBar
中的堆栈缓冲区溢出,或者它调用的函数之一
使用(g++-fsanize=address…
)构建程序应该可以直接指出问题所在
更新:
我在拿到现金后打印了jj的价值,但上面说仍然是3
你必须意识到这一点
- 没有什么神奇之处(要么
jj
不是真的3,要么你的编译器坏了(可能性很小))
- 调试是一项技能
可能发生的情况是,GDB只打印jj
的低位32位,但编译器使用整个64位寄存器(假设为64位机器)来执行比较(并期望高位都为0)。而newBar
中的某些内容将jj
的高位设置为非零值
现在,您可以通过以下几种方式之一进行调试:
- 使用
disas
命令,查找实际的cmp
指令,在比较时检查寄存器,或
- 将
jj
的类型从int
更改为size\u t
(至少GDB不会执行任何截断),或者
- 在地址消毒剂下运行(如已建议的)
什么是newBar()
?另外,如果该函数是非静态成员,则Backtest
实例最好是有效的。是否有其他线程正在运行?“获取现金”从何而来?刚刚更新的newBari在获取现金后打印出jj的价值,但它说仍然是3
(gdb) next
start !!
3020
407 count = 0;
(gdb)
408 jj=0;
(gdb)
409 while(jj<bars.size()){
(gdb)
410 std::cout << "on bar " << jj<<std::endl;
(gdb)
on bar 0
411 newBar(&bars[jj]);
(gdb)
412 jj++;
(gdb)
409 while(jj<bars.size()){
(gdb)
410 std::cout << "on bar " << jj<<std::endl;
(gdb)
on bar 1
411 newBar(&bars[jj]);
(gdb)
412 jj++;
(gdb)
409 while(jj<bars.size()){
(gdb)
410 std::cout << "on bar " << jj<<std::endl;
(gdb)
on bar 2
411 newBar(&bars[jj]);
(gdb)
412 jj++;
(gdb)
409 while(jj<bars.size()){
(gdb)
410 std::cout << "on bar " << jj<<std::endl;
(gdb)
on bar 3
411 newBar(&bars[jj]);
(gdb)
asd
|100000.000000,100000.000000|
get cash 100000.0
412 jj++;
(gdb)
409 while(jj<bars.size()){
(gdb)
415 }
void Backtest::newBar(Bar* b)
{
if(Number == count+1){
tempbars.push_back(*b);
crossLimitOrder();
strategyPy->onBar(tempbars);
tempbars.clear();
count = 0;
}else{
tempbars.push_back(*b);
count ++;
}
}