Я знаю, что последние версии Xcode показывают встроенные функции и позволяют выполнять действия внутри встроенного кода. Я пытаюсь отладить код, в котором интенсивно используется std::function, и я бы предпочел, чтобы и стек вызовов, и пошаговая операция просто пропускали все детали реализации std::function. Новая libc++ помечает эти детали атрибутом «always_inline», чтобы они всегда были встроенными (даже в отладочных сборках), что мне и нужно. На самом деле, поскольку я не отлаживаю реализацию std::function, я просто не хочу видеть эти функции...
Есть ли способ удалить встроенные функции из стека вызовов в отладчике Xcode?
Ответы (1)
Вы не можете сделать это прямо сейчас. Вы можете изменить способ стека кадров отчетов lldb в трассировке -- см. http://lldb.llvm.org/formats.html - но я не могу придумать, как заставить его подавить (синтезированные) встроенные кадры стека из вашей обратной трассировки. У gdb была настройка, позволяющая избежать синтаксического анализа всей встроенной информации в отладочной информации — без пошагового и обратного отслеживания — но это не было добавлено в lldb.
На самом деле, вы действительно не хотите отключать пошаговую поддержку встроенного кода. Без определения того, какой код является встроенным, «следующий» или «шаговый» режим пошагового выполнения ужасно ломается со встроенным кодом. Xcode 4.6 довольно хорош в этом, но в остальных случаях вы «перешагиваете» исходную строку со встроенным кодом и видите фактическую встроенную реализацию из файла .h
из-за неправильной отладочной информации от компилятора. Получить правильную информацию об отладке сложно, и хотя большая ее часть верна, вы все равно иногда будете использовать встроенный метод с Xcode 4.6. Возможно, для контейнеров, которые вы используете, вы часто попадаете в него, но это не общий случай.
lldb позволяет настраивать вывод bt
, см. http://lldb.llvm.org/formats.html , но нет возможности подавить встроенные фреймы стека. Вы можете довольно легко написать обходчик стека на питоне, который делает то же самое, что и настоящий bt
, но пропускает встроенные фреймы — метод SBFrame::IsInlined()
упрощает эту задачу. Но это не поможет в случае, когда вы используете Xcode.
step
поверх чего-то вроде vector.push_back
и не хотите на самом деле переходить к встроенной реализации этого. Вы можете попробовать использовать настройку target.process.thread.step-avoid-regexp
, например settings set target.process.thread.step-avoid-regexp ^[^ ]+ std::|^std::
в файле ~/.lldbinit
.
- person Jason Molenda; 18.02.2013