2016-10-07 2 views
3

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

До сих пор я пытался делать

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

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

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

шса -f --source-шаблоны регулярных выражений

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

+0

Вы можете поместить список функций в файл break в качестве команд break. Должно быть легко создано из файла заголовка. Пробег gdb с флагом -x: 'gdb -x command_file_name' – bruceg

+0

Проблема в том, что я хочу, чтобы более общее решение и нарушение функций в заголовках не соответствовало адекватным случаям, когда функция не объявлена ​​в заголовке, например когда он объявлен в исходном файле и передан как указатель на функцию. –

+0

Удачи. Сообщите нам, что вы выяснили. – bruceg

ответ

2

Спецификация -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() 
{ 
    ... 
} 

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

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

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

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