Используя остановку gdb программа, когда это использует любую функцию из файла X

Я использую два разных способа в зависимости от объекта.

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.

20
задан Svante 24 January 2009 в 01:38
поделиться

5 ответов

Шаг 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 говорится, что это еще не реализовано.

22
ответ дан 29 November 2019 в 23:41
поделиться

Ответ нанятого русского выглядит очень хорошим, но так как Вы говорите:

я не знаю точно, какие функции названы и каковы функции не.

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

2
ответ дан 29 November 2019 в 23:41
поделиться

Можно использовать команду:

break foo.cpp:function-name
1
ответ дан 29 November 2019 в 23:41
поделиться

точки останова gdb имеют несколько синтаксисов... Посмотрите здесь.

Это не повредится ни на какой функции в файле хотя....

Редактирование: Вы могли сделать что-то глупое как создание всего вызова функции фиктивное функциональное пустое нечто (пусто) и установить контрольные точки внутри. По крайней мере, Вы повредились бы в файле и должны быть тривиальными для нахождения, какая функция в стороне файла X вызывается.

0
ответ дан 29 November 2019 в 23:41
поделиться

rbreak regex

Устанавливает точки останова для всех функций, соответствующих регулярному выражению regex. Эта команда устанавливает безусловную точку останова для всех совпадений, распечатывая список всех установленных ею точек останова. После того, как эти точки останова установлены, они обрабатываются так же, как точки останова, установленные с помощью команды break. Вы можете удалить их, отключить или сделать их условными так же, как и любую другую точку останова.

Синтаксис регулярного выражения является стандартным, используемым с такими инструментами, как `grep '. Обратите внимание, что это отличается от синтаксиса, используемого оболочками, поэтому, например, foo * соответствует всем функциям, которые включают fo, за которым следует ноль или более os. Существует неявный. * Начальный и конечный регулярное выражение, которое вы предоставляете, поэтому для сопоставления только функций, начинающихся с foo, используйте ^ foo.

При отладке программ C ++ rbreak полезен для установки точек останова для перегруженных функций, которые не являются членами каких-либо специальных классов.

12
ответ дан 29 November 2019 в 23:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: