lldb - как установить точку останова для всех функций в файле cpp

Я пытаюсь выполнить большой проект> 100k loc, но беспокоюсь только о взаимодействии с lib. Есть ли способ заставить lldb разбивать все объявления функций в одном исходном файле?

Пока я пробовал делать

br s -f <file> --func-regex .*

с информацией из из gdb в lldb и решение gdb, но это, похоже, нарушает все вызовы функций в файле, что вызывает 5129 совпадений для 4911 строковый исходный файл.

Возможным решением может быть сопоставление исходного регулярного выражения для поиска вызовов функций через

br s -f --source-pattern-regexp

но, учитывая нелепые правила синтаксического анализа C ++, регулярное выражение, которое соответствует всем случаям, невозможно.


person James Deng    schedule 07.10.2016    source источник
comment
Вы можете поместить список функций для прерывания в файл как команды прерывания. Должно быть легко создать из вашего файла заголовка. Запуск gdb с флагом -x: gdb -x command_file_name   -  person bruceg    schedule 07.10.2016
comment
Проблема в том, что мне нужно более общее решение, а нарушение функций в заголовках неадекватно охватывает случаи, когда функция не объявлена ​​в заголовке, например, когда она объявлена ​​в исходном файле и передается как указатель на функцию.   -  person James Deng    schedule 07.10.2016
comment
Удачи. Сообщите нам, что вы выяснили.   -  person bruceg    schedule 07.10.2016


Ответы (1)


Спецификация -f действительно ограничивает поиск точки останова до Единицы компиляции, определенной <file>, и поэтому в конечном итоге включает все экземпляры шаблонов, которые содержит эта Единица Компиляции, которых, если вы используете какой-либо материал std::, обычно много, как вы обнаружили.

Отладчик обычно знает, где была объявлена ​​функция (это часть отладочной информации), поэтому мы могли бы добавить опцию для обработки -f как «файла объявления», а не «имени блока компиляции». Тогда вы могли бы сказать что-то вроде:

(lldb) break set -f foo.h -f foo.cpp --match-declaration-file --func-regex .*

Это было бы довольно просто добавить. Если вы так склонны, отправьте запрос на улучшение этого эффекта на http://bugreporter.apple.com .

Если вы следуете соглашению о написании ваших функций, например:

void A::foo()
{
  ...
}

Затем вы можете создать исходное регулярное выражение для "^ {". Это было основной причиной такого соглашения о кодировании, благодаря которому очень легко было определить начало функций.

Если экземпляры шаблона в основном поступают из std, вы можете найти файл .o и сделать что-то вроде (это в OS X):

$ nm <file-basename>.o -s __TEXT __text -j | c++filt | grep -v std

Это создаст список функций, отличных от стандартных, в этом файле .o, а затем вы можете добавить break set -n в начало каждой строки и исходить из этого файла.

person Jim Ingham    schedule 07.10.2016
comment
nm-уловка потрясающая. Если вы не знаете, какие библиотеки использует ваш двоичный файл, вы также можете запустить ldd на двоичном файле и узнать. Иногда также полезно выполнить поиск --func-regex, сужая функции по пространствам имен, например: breakpoint set --func-regex clang::format::* - person Artyom Gevorgyan; 11.10.2020
comment
Простите, я имел в виду breakpoint set --func-regex ^clang::format::*, иначе будут выбраны функции, которые не принадлежат пространству имен clang::format, но принимают параметры типа из этого пространства имен. - person Artyom Gevorgyan; 11.10.2020
comment
Придется признать, что подход, основанный на пространстве имен, тоже не сработает. Типы возвращаемых данных также могут поступать из пространства имен, но меня интересуют только функции из него. Описанный подход с nm - лучший обходной путь. - person Artyom Gevorgyan; 11.10.2020
comment
Другой способ сделать это - написать собственный преобразователь точки останова. Установите его на глубину модуля (это значение по умолчанию). Вашему преобразователю будет передан SBSymbolContext, содержащий модуль, в котором вы должны установить точку останова, и вы можете вызвать SBModule.FindFunctions, чтобы получить все функции. Вы можете получить имена функций из SBFunction, и, поскольку вы используете Python, у вас больше гибкости для фильтрации имен по своему усмотрению. - person Jim Ingham; 15.10.2020