Есть ли способ удалить встроенные функции из стека вызовов в отладчике Xcode?

Я знаю, что последние версии Xcode показывают встроенные функции и позволяют выполнять действия внутри встроенного кода. Я пытаюсь отладить код, в котором интенсивно используется std::function, и я бы предпочел, чтобы и стек вызовов, и пошаговая операция просто пропускали все детали реализации std::function. Новая libc++ помечает эти детали атрибутом «always_inline», чтобы они всегда были встроенными (даже в отладочных сборках), что мне и нужно. На самом деле, поскольку я не отлаживаю реализацию std::function, я просто не хочу видеть эти функции...


person alexk7    schedule 15.02.2013    source источник


Ответы (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.

person Jason Molenda    schedule 16.02.2013
comment
Случайные перешагивания ошибок меня не беспокоят. Меня больше беспокоит попытка отладки моего рекурсивного кода... Думаю, я прошу режим, который учитывает всю отладочную информацию, но просто отфильтровывает встроенные фреймы и всегда автоматически перешагивает встроенный код (останавливая при достижении реального вызова функции). - person alexk7; 16.02.2013
comment
А, ладно, кажется, я понимаю, к чему ты клонишь. Вы делаете 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