Я использую два разных способа в зависимости от объекта.
if( !variable ){
// variable is either
// 1. '';
// 2. 0;
// 3. undefined;
// 4. null;
// 5. false;
}
Иногда я не хочу оценивать пустую строку как false, поэтому я использую этот случай
function invalid( item ){
return (item === undefined || item === null);
}
if( invalid( variable )){
// only here if null or undefined;
}
Если вам нужно обратное, то в первом экземпляре! переменная становится переменной !! и в недопустимой функции === становится! = и имена функций меняются на notInvalid.
Шаг 1: создайте список всех функций, определяемых в foo.cpp
самый простой способ, которым я могу думать (предположение, что Вы имеете binutils
и GNU grep
):
nm a.out | grep ' T ' | addr2line -fe a.out |
grep -B1 'foo\.cpp' | grep -v 'foo\.cpp' > funclist
Шаг 2: создайте сценарий GDB, который установит точку останова на каждой из вышеупомянутых функций:
sed 's/^/break /' funclist > stop-in-foo.gdb
[Очевидно, шаги 1 и 2 могли быть объединены;-]
Шаг 3: на самом деле установите точки останова:
gdb a.out
(gdb) source stop-in-foo.gdb
Рассмотрение этот ответ, еще более простое (если Вы находитесь на Fedora Linux) способ узнать, какие функции foo.cpp вызваны:
ftrace -sym='foo.cpp#*' ./a.out
Слишком плохой в странице справочника ftrace говорится, что это еще не реализовано.
Ответ нанятого русского выглядит очень хорошим, но так как Вы говорите:
я не знаю точно, какие функции названы и каковы функции не.
Был бы, отчет которого функции поражены, сгенерированные инструментом покрытия кода такой как gcov или что-то включающее Valgrind быть хорошим решением Вашей проблемы?
Можно использовать команду:
break foo.cpp:function-name
точки останова gdb имеют несколько синтаксисов... Посмотрите здесь.
Это не повредится ни на какой функции в файле хотя....
Редактирование: Вы могли сделать что-то глупое как создание всего вызова функции фиктивное функциональное пустое нечто (пусто) и установить контрольные точки внутри. По крайней мере, Вы повредились бы в файле и должны быть тривиальными для нахождения, какая функция в стороне файла X вызывается.
rbreak regex
Устанавливает точки останова для всех функций, соответствующих регулярному выражению regex. Эта команда устанавливает безусловную точку останова для всех совпадений, распечатывая список всех установленных ею точек останова. После того, как эти точки останова установлены, они обрабатываются так же, как точки останова, установленные с помощью команды break. Вы можете удалить их, отключить или сделать их условными так же, как и любую другую точку останова.
Синтаксис регулярного выражения является стандартным, используемым с такими инструментами, как `grep '. Обратите внимание, что это отличается от синтаксиса, используемого оболочками, поэтому, например, foo * соответствует всем функциям, которые включают fo, за которым следует ноль или более os. Существует неявный. * Начальный и конечный регулярное выражение, которое вы предоставляете, поэтому для сопоставления только функций, начинающихся с foo, используйте ^ foo.
При отладке программ C ++ rbreak полезен для установки точек останова для перегруженных функций, которые не являются членами каких-либо специальных классов.