Я пытаюсь отладить код C ++ с помощью Xcode 4.5, скомпилированного с llvm 4.1. Код очень прост, просто вставив несколько элементов на карту.
Когда я перехожу через функции STL, выполнение останавливается внутри кода STL, вместо того, чтобы выполнить шаг как обычно.
Когда я компилирую с использованием LLVM-GCC 4.2, отладка просто прекрасна, но этот компилятор не поддерживает C ++ 11.
Кто-нибудь сталкивался с этой проблемой раньше и знает, можно ли ее исправить?
Я, конечно, могу испытать ту же проблему, так как LLDB был введен в Xcode. Кажется, что он не обрабатывает должным образом переступая через встроенные функции (см .: Отладчик шагает глубже, когда пытается выйти из C ++ 11 std lib).
Я только что отправил отчет об ошибке в Apple (ID 12588579), но я предполагаю, что потребуется несколько итераций, прежде чем LLDB будет полностью готов к использованию в производственном коде C ++ 11 (он уже там, помните поставленную версию) с XCode вообще не был применим до 4.4).
Lldb в Xcode 4.5.x не поддерживает переход по встроенным функциям. Стандартная библиотека C ++ 11 имеет агрессивное встраивание функций, даже если она построена при -O0, поэтому эта проблема особенно очевидна. С тех пор в lldb, v была добавлена встроенная поддержка степпинга. http://llvm.org/viewvc/llvm-project?view=rev&Пересмотр = 163044 и доступен для использования в источниках на http://lldb.llvm.org/ но вы не сможете заменить lldb внутри XCode этими источниками (API были изменены с момента выпуска 4.5).
Обратите внимание, что переход по встроенным функциям — создание их «настоящими» функциями во время работы в отладчике — это сложная функция, и любые неточности в отладочной информации, генерируемой clang, могут вызвать плохое поведение при переходе. Есть (и все еще будут) угловые случаи, которые не работают должным образом либо из-за недостаточной информации об отладке, либо из-за ошибок в lldb — это сложно сделать 100% правильно.
Вы можете попытаться немного уменьшить трудоемкость программирования на C ++ 11 std lib, поставив
settings set target.process.thread.step-avoid-regexp ^[^ ]+ std::|^std::
в вашем ~/.lldbinit
файл. Я не думаю, что это поможет с встроенными функциями, но если вызов метода stdlib находится за пределами строки, он по крайней мере перешагнет через него.