문제

디버거(또는 CLR 예외 처리기)가 pdb를 사용하여 릴리스 모드에서 예외가 발생한 줄을 표시할 수 있습니까?

릴리스 모드의 코드는 최적화되어 있으며 항상 "원본" 코드의 순서와 논리를 따르지는 않습니다.

릴리스 모드에서도 디버거가 내 코드를 단계별로 탐색할 수 있다는 점도 놀랍습니다.최적화로 인해 탐색이 매우 불편해집니다.

이 두 가지 사항을 명확히 설명해 주시겠습니까?

도움이 되었습니까?

해결책

나는 이것이 CLR에서 어떻게 수행되는지에 익숙하지 않지만 아마도 기본 코드로 수행 된 방식과 매우 유사 할 것입니다. 컴파일러가 기계 지침을 생성하면 PDB에 항목이 기본적으로 "현재 주소의 명령어 X는 foo.cpp의 25 행에서 나왔습니다"라고 말합니다.

디버거는 현재 어떤 프로그램 주소가 실행 중인지 알고 있습니다. 따라서 PDB에서 일부 주소 X를 찾아 Foo.cpp의 25 행에서 온 것을 본다. 이것을 사용하면 소스 코드를 통해 "단계"할 수 있습니다.

이 프로세스는 디버그 또는 릴리스 모드에 관계없이 동일합니다 (PDB가 릴리스 모드에서 전혀 생성되는 경우). 그러나 최적화로 인해 릴리스 모드에서 종종 디버거가 코드를 통해 "선형"을 밟지 않을 것입니다. 예기치 않게 다른 선으로 뛰어들 수 있습니다. 이는 최적화가 지침 순서를 변경했기 때문이지만 소스 간 매핑을 변경하지 않으므로 디버거가 여전히 따라갈 수 있습니다.

다른 팁

[@확실하지 않음] 거의 맞습니다.그만큼 컴파일러 현재 기계어 명령어와 밀접하게 일치하는 적절한 줄 번호를 식별하기 위해 최선을 다합니다.

PDB와 디버거는 최적화에 대해 아무것도 모릅니다.PDB 파일은 기본적으로 기계 코드의 주소 위치를 소스 코드 줄 번호에 매핑합니다.최적화된 코드에서는 어셈블리 명령을 특정 소스 코드 줄과 정확히 일치시키는 것이 항상 가능한 것은 아니므로 컴파일러는 현재 가지고 있는 가장 가까운 것을 PDB에 기록합니다.이는 "이전의 소스 코드 라인" 또는 "포함 컨텍스트(루프 등)의 소스 코드 라인" 또는 다른 것일 수 있습니다.

그럼에도 불구하고 디버거는 기본적으로 PDB 맵에서 현재 IP(명령 포인터)에 가장 가까운("이전 또는 같음"과 같은) 항목을 찾아 해당 줄을 강조 표시합니다.

때로는 경기가 별로 좋지 않을 때도 있는데, 이때 강조 표시된 영역이 여기저기 뛰어다니는 것을 볼 수 있습니다.

디버거는 문제가 발생한 위치를 가장 잘 추측합니다. 100% 정확하지 않으며 완전히 최적화 된 코드를 사용하면 종종 부정확합니다. 몇 줄에서 완전히 잘못된 통화 스택을 갖는 것까지 부정확 한 부정확성을 발견했습니다.

최적화 된 코드를 사용하여 디버거가 얼마나 정확한 지 실제로 코드 자체와 최적화에 달려 있습니다.

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