생성자의 로컬 변수는 따르지 않습니다. 이것이 GDB의 버그입니까?

StackOverflow https://stackoverflow.com/questions/224090

  •  03-07-2019
  •  | 
  •  

문제

현재 Ubuntu Linux에서 GDB 버전 6.7.1을 실행하고 있으며 C ++ 프로젝트에서 일하고 있습니다.

놀랍게도 나는 생성자를 디버깅하려고했는데 생성자의 범위 내에서 선언 된 로컬 변수는 GDB가 따르거나 눈에 띄지 않는 것을 발견했습니다. 이것은 버그입니까?

정보에 감사드립니다 ..

도움이 되었습니까?

해결책

이것은 벌레 GCC에서는 GDB가 아닙니다.

최근이었습니다 결정된.

다른 팁

최적화 (-o)를 사용하는 경우 비활성화하십시오 (-o를 제거하거나 -o0을 사용하십시오). 컴파일러는 때때로 너무 똑똑하고 필요하지 않은 변수를 추측하고, 컴파일 시간에 계산하거나, 변수의 범위를 변경하거나, 다른 여러 트릭을 변경합니다.

"최적화 없음"을 사용하더라도 일부 사소한 최적화는 여전히 수행되지만 디버깅을 많이 방해해서는 안됩니다. 또한 C ++ (STL 포함)를 인라인으로 무게 사용하면 최적화없이 프로그램이 훨씬 느려질 수 있습니다.

최적화 된 빌드를 디버깅하는 것처럼 들립니다.

기호 파일이 함수 스택 프레임에서 해당 위치를 설명하기 때문에 디버거는 로컬 변수의 값을 '알고 있습니다.

그런 다음 디버거는 대상 프로세스의 메모리에서 변수를 읽을 수 있습니다. 그러나 스택 프레임에는 로컬 변수의 최신 사본이 포함되어 있어야합니다. 최적화없이 컴파일 할 때 생성 된 코드는 수정 될 때마다 로컬 변수를 스택 프레임 위치에 항상 다시 작성합니다. 이로 인해 디버깅은 쉽지만 런타임에는 비용이 많이 듭니다.

최적화 된 빌드의 경우 컴파일러는 이러한 단계가 불필요하다는 것을 자주 추론하고 필요한 한 CPU 레지스터에 값을 유지합니다. 로컬 변수가 스택에 값을 전혀 얻지 못할 수도 있습니다. 이 경우 디버거는 변수의 값을 추적 할 방법이 없지만이를 알지 못하며 종종 가변 값인 것처럼 스택에서 데이터를보고합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top