2010-08-05 2 views
4

내 C++ 코드에서 디버거를 사용하고 있는데 (때로는이 점에 영감을받은 GDB와 함께 QT Creator였습니다) make clean을 호출 한 후 make을 호출 한 후에도 디버거가 이상한 것처럼 보입니다.디버거가 왜 놀라서 내 코드와 일치하지 않는 이유가 무엇입니까?

때로는 다른 코드의 줄 번호와 일렬로 늘어서는 것처럼 보일 것입니다. 때로는 한 줄 씩 벗어나는 경우가 있습니다. 때로는 이것이 완전히 벗어나기도하고 때로는 불규칙하게 뛰어 넘을 수도 있습니다.

다른 경우에는 함수 호출을 단계별로 수행하는 동안 단계별로 묻지 않은 것들을 단계적으로 실행하여 놀라서 울릴 것입니다.이 단계는 함수의 일부인 문자열 초기화 루틴으로 넘어갈 수 있습니다.

seg 결함이 생기면 때로는 완벽하게 어디에서 발생했는지 알 수 있으며 다른 경우에는 코드라고하는 함수에 대한 물음표를 표시 할 수 없으며 어디에서나 내가 볼 수있는 것은 모두 어셈블리입니다. 똑같은 코드를 반복적으로 실행합니다.

이러한 오류의 원인을 패턴으로 파악할 수없는 경우가 있으며 때로는 디버거가 완벽하게 올바르게 동작하는 경우가 있습니다.

이러한 디버거 괴물의 배경에는 어떤 이론적 인 이유가 있으며이를 막기 위해 수행 할 수있는 구체적인 단계는 무엇입니까?

답변

10

당신은 최적화 된 코드를 디버깅하고 3 매우 일반적인 이유

  • 있다. 이것은 거의 작동하지 않는 최적화 된 코드는 재정렬/인라인/사전 계산/등 수 있습니다. 요점은 소스 코드로 되돌릴 수있는 기회가 전혀 없다는 것입니다.

  • 어떤 이유에서든 현재 소스 코드와 일치하는 바이너리는 디버깅하지 않습니다.

  • 어딘가에서 정의되지 않은 동작을 호출했습니다. 코드가 수행 한 모든 작업이 있으면 디버거가 온전한 상태를 유지해야하는 스캐 폴딩이 뒤죽박죽입니다. 이는 보통 세그 폴트가 생겨 정상적인 스택 추적을 얻을 수 없거나 디버거가 수행해야하는 정보 (예 : 스택 포인터)를 덮어 쓰거나 섞어 버렸을 때 일반적으로 발생합니다.

아마도 개인적으로 발생하는 수백 가지 이상의 것들이 있습니다 : 다중 스레드 코드 디버깅; gcc/gdb 버전 및 기타 여러 가지 사항에 따라 꽤 많은 디버거 버그가있었습니다.

+0

나는 $ 5를 전자에 넣었다. Btw, 전체 응용 프로그램을 디버그 빌드로 다시 작성하지 않으려면 pragma를 통해 파일별로 개별적으로 최적화를 비활성화 할 수 있습니다. 컴파일러에 따라 다르지만 Visual Studio에서는 #pragma optimize ("", off)를 시도 할 수 있습니다. – EboMike

2

하나의 가능한 이유는 디버거가 다른 프로그램과 마찬가지로 버그가 있다는 것입니다.

그러나 디버거가 올바른 소스 위치를 표시하지 않는 가장 일반적인 이유는 컴파일러가 코드를 어떤 식 으로든 최적화했기 때문에 소스 코드와 실행 코드 사이에 간단한 대응이 없기 때문입니다. 디버거를 혼란스럽게 만드는 일반적인 최적화는 인라이닝 (inline)이며, C++은 매우 복잡합니다.

예를 들어, 문자열 초기화 루틴이 함수 호출에 인라인되어있을 수 있으므로 디버거에 관한 한 일부 문자열 초기화 코드로 시작하는 함수가있었습니다.

알고리즘 버그 (정의되지 않은 동작 또는 동시성 버그를 생성하는 코딩 버그와 달리)를 추적하는 경우 디버거가 더 간단 할 것이므로 최적화 수준을 낮추면 버그를 추적하는 데 도움이됩니다 코드보기.

0

나는 당신과 같은 질문을 가지고 있으며 아직 해결할 수 없습니다. 하지만 가상 머신을 설치하고 유닉스 시스템을 설치하는 문제 해결 방안이 하나있다. 그리고 리눅스 시스템에서 그것을 디버그하십시오. 아마 그것이 효과가있을 것입니다.

나는 그 이유를 발견했다. 코드를 바꿀 때마다 프로젝트를 다시 만들어야한다. 그렇지 않으면 Qt가 코드의 이전 버전을 실행하게된다.

+0

스택 오버플로에 오신 것을 환영합니다! 새로운 질문이있는 경우 [Ask Question] (// stackoverflow.com/questions/ask) 버튼을 클릭하여 질문하십시오. 당신이 충분한 평판을 가지고 있다면, [당신은 upvote] (// stackoverflow.com/privileges/vote-up) 질문을 할 수 있습니다. 또는 별표를 즐겨 찾기로 추가하면 새로운 답변을 알려줍니다. – manetsus

관련 문제