C++ c++;loop在centOS7上错误跳出?

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 " &

我有一个项目,编译后在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 " << 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 ++;
    }        
}