2012-07-18 3 views
0

릴리스 모드에서 전화로 디버거를 실행하면 디버거에 이상한 오류가 발생합니다. xcode 4.3.3에서 gdb 또는 lldb를 사용하든, 코드의 PC가 실제로 그 지점을 가리키고 있지는 않지만 코드는 중단 점에 놓이게됩니다.xcode 4.3.3 gdb 또는 lldb 디버거가 점프

예 가짜 코드 : 여기에 또 다른 중단 점-C를 설정

if (true) { 
    // set breakpoint-A here 
} else { 
    // set breakpoint-B here 
} 

//.

브레이크 포인트 B에 도착한 다음 중단 점 A로 점프합니다.

우리가 "릴리스"모드에 있기 때문에 최적화가 이루어 졌습니까?

감사합니다.

답변

3

예, 여기에는 다음 세 가지가 있습니다. 릴리스 모드로 빌드하면 컴파일러는 최적화 된 코드 생성을 수행합니다. 컴파일러는 소스 라인이 프로그램에 컴파일되는 순서를 변경할 수 있습니다 (코드의 의미가 변경되지 않는 한). 다른 소스 라인 간의 명령어가 혼합되거나 재 배열 될 수 있으며, 마지막으로 라인에 문제가 발생할 수 있습니다 테이블을 컴파일러에서 내 보냅니다.

두 개의 소스 라인을 상상해보십시오. 각 소스 라인은 8 개의 어셈블리 언어 명령어로 바뀝니다. 컴파일러는 CPU를 가장 효율적으로 실행하기 위해 이러한 16 개의 명령어를 재 배열 할 수 있습니다 (결과가 변경되지 않는 한). 그러나이 상황에서 컴파일러는 어떤 명령을 1 행과 동일하게해야합니까? 그리고 컴파일러는 어떤 명령을 2 행과 동등해야한다고 말합니까?

최적화 된 코드 디버깅을 사용하면 소스 코드 수준에서 디버깅하는 경우 프로그램을 단계별로 실행하는 동안 "현재 실행중인 소스 행"이 많이 튀어 나오게됩니다. 범위에있는 것으로 보이는 변수는 알 수없는 시간에 나타나고 사라집니다. 컴파일러의 방식은 까다 롭고 이해하기 어렵습니다. 실제로 일어나고있는 일을 따라하기 위해 어셈블리 언어 코드 (또는 소스 + 어셈블리 디스플레이)를 사용하여 디버깅해야합니다.

최적화 된 코드 소스 레벨 디버깅을 개선하기 위해 컴파일러와 디버거가 개선 할 수있는 점이 있지만 항상 따라하기는 어려울 것입니다.

1

Xcode는 메서드의 모든 return 문에서 해당 메서드의 첫 번째 return 문으로 이동하는 경향이 있습니다. (Xcode 4.3.3에서도 여전히 그렇습니다. 아직 4.5 버전이 아직 확실하지 않습니다.)

마지막으로 강조 표시된 'return'문장을 무시하십시오.

관련 문제