xcode 4.3.3 скачки отладчика gdb или lldb

У нас есть странная ошибка с нашими отладчиками при запуске отладчика на телефоне в режиме деблокирования. Независимо от того, используем ли мы gdb или lldb с xcode 4.3.3, код попадет в точки останова, даже если ПК кода на самом деле не указывает на это место.

Пример поддельного кода:

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

// установить здесь еще одну точку останова-C.

Он приземлится в точке останова-B, а затем перейдет к точке останова-A.

Причина в том, что мы находимся в режиме «выпуска» и оптимизируем?

Спасибо!


person finneycanhelp    schedule 18.07.2012    source источник


Ответы (2)


Да, здесь происходят три вещи: Когда вы строите в режиме выпуска, компилятор выполняет оптимизированную генерацию кода. Компилятор может изменить порядок, в котором строки исходного кода компилируются в программу (при условии, что это не меняет смысла кода), инструкции между различными строками исходного кода могут смешиваться или переставляться, и, наконец, могут возникнуть проблемы со строкой. таблицу, которую выдает компилятор.

Представьте себе две строки исходного кода, каждая из которых превращается в 8 инструкций на ассемблере. Компилятор может переупорядочить эти 16 инструкций (при условии, что это не изменит их результаты), чтобы обеспечить наиболее эффективную работу ЦП. Но в этой ситуации, какая инструкция должна быть признана компилятором эквивалентной строке 1? и какая инструкция должна быть эквивалентна строке 2 компилятором?

При оптимизированной отладке кода, если вы выполняете отладку на уровне исходного кода, вам приходится жить с реальностью, что «выполняемая в данный момент строка исходного кода» будет сильно колебаться, пока вы выполняете свою программу. Переменные, которые кажутся находящимися в области видимости, будут появляться и исчезать в неочевидное время. Способы компилятора сложны и трудны для понимания. Вам нужно отлаживать код на языке ассемблера перед вами (или исходный код + отображение сборки), чтобы действительно следить за тем, что происходит.

Существуют улучшения, которые компиляторы и отладчики могут внести для улучшения отладки оптимизированного кода на уровне исходного кода, но, вероятно, всегда будет немного сложно следовать им.

person Jason Molenda    schedule 29.09.2012

Xcode также имеет тенденцию переходить от любого оператора возврата в методе к первому оператору возврата в этом методе. (Xcode 4.3.3 все еще делает это. Я еще не уверен насчет 4.5.)

Просто игнорируйте последний выделенный оператор return.

person Walt Sellers    schedule 03.10.2012