2017-11-06 8 views
-1

내가 컴파일 한 후 우분투에서 잘 작동하는 프로젝트를, 코드 조각 같은 수 있습니다 : 우분투에C++ 루프가 centOS7에서 잘못 튀어 나왔습니까?

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++; 
    } 
} 

모든 것이 잘 작동 크기는 약 3020입니다 바 있지만, CentOS는 7 만 JJ = 3에서 종료, GDB 출력 : GDB (409)에서

(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 ++; 
    }   
} 

PS newBar 프로젝트에 뭔가 다른,()는 기본적으로 뭔가를 할 수있는 strategyPy를 호출하고, 그 getCash 포함 파이썬 일부 API를 제공 C++ 기능 (전화 부스트 파이썬 모듈을 호출 것입니다 , 그게 왜 디버그 정보에 출력하는지)

+1

'newBar()'란 무엇입니까? 또한이 함수가 비 정적 멤버 인 경우,'Backtest' 인스턴스가 더 유효합니다. – PaulMcKenzie

+1

다른 스레드가 실행 중입니까? "현금을 얻는 곳"은 어디에서 오는가? – wally

+0

방금 ​​newBar를 업데이트했습니다 –

답변

1

get cash 바로 다음에 jj의 값을 인쇄하는 것이 흥미로울 것입니다.

내 크리스탈 볼은 매우 큰 양수 또는 음수 값을 갖고 있다고 말합니다.이 경우, 스택 버퍼 오버 플로우가 newBar 어딘가에서 발생하거나 해당 함수 중 하나가 호출됩니다.

Address Sanitzer (g++ -fsanitize=address ...)으로 프로그램을 작성하면 문제를 직접 지적해야합니다.

업데이트 :

난 그냥 후 현금을 얻을 JJ의 값을 출력하지만, 그것은 여전히 ​​

  • 더를 3 실현해야

이 있음을 말한다 마법 (jj은 실제로 3이 아니거나 컴파일러가 깨졌습니다 (거의 없습니다)

  • 디버깅 어떤 가능성 일어나는 것은 GDB 인쇄 만 jj의 하위 32 비트 만, 컴파일러는 상기 비교를 수행하는 (64 비트 시스템 가정), 전체 64 비트 레지스터를 사용하는 기술
  • (그리고 상위 비트가 모두 0이 될 것으로 예상 함). newBar의 값은 jj의 상위 비트를 0이 아닌 값으로 설정합니다. int에서

  • 변화를 jj의 유형을 실제 cmp 명령을 찾을 수

    • 사용 disas 명령 비교시 레지스터를 검사하거나 :

      지금, 당신은 몇 가지 방법 중 하나를 디버깅 할 수 있습니다 size_t (적어도 GDB는 절단을 수행하지 않음) 또는

    • (이미 제안 된대로)에서 실행됩니다.
  • +0

    현금을 얻은 직후 jj의 값을 인쇄하지만 아직 밝혀졌습니다. 3 –

    +0

    러시아인 덕분에 나를 구해 줬습니다. –