Может ли мое приложение организовать точку останова или часы GDB? - PullRequest
4 голосов
/ 19 апреля 2010

Есть ли способ для моего кода быть инструментированным для вставки точки останова или отслеживания в ячейке памяти, которая будет соблюдаться GDB? (И, вероятно, не имеют никакого эффекта, когда GDB не подключен.)

Я знаю, как выполнять такие вещи, как команды GDB в сеансе GDB, но для определенных типов отладки было бы очень удобно делать это «программно», если вы знаете, что я имею в виду - например, только ошибка происходит с определенным обстоятельством, а не с первым из 11 024 раз, когда вызывается подпрограмма сбоя, или с первым 43 028 503 раз, когда ячейка памяти модифицируется, поэтому установка простой точки останова для подпрограммы или точки наблюдения для переменной не помогает это все ложные срабатывания.

Меня больше всего беспокоит Linux, но мне любопытно, существуют ли подобные решения для OS X (или Windows, хотя, очевидно, не для gdb).

Ответы [ 4 ]

3 голосов
/ 19 апреля 2010

Для точек останова на x86 вы можете сломать в любом месте с помощью

asm("int3");

К сожалению, я не знаю, как определить, работаете ли вы внутри GDB (выполнение этого вне отладчика убьет вашу программу сигналом SIGTRAP)

2 голосов
/ 21 августа 2013

Обычно используемый подход заключается в использовании фиктивной функции с неочевидным именем. Затем вы можете увеличить свой .gdbinit или использовать любую другую технику, чтобы всегда использовать это имя символа.

Тривиальная фиктивная функция:

void my_dummy_breakpoint_loc(void) {}

Проверяемый код (может быть макросом типа assert):

if (rare_condition)
    my_dummy_breakpoint_loc();

сеанс GDB (очевидно, а?):

b my_dummy_breakpoint_loc

Важно убедиться, что "my_dummy_breakpoint_loc" не оптимизирован компилятором, чтобы этот метод работал.

В самых причудливых случаях фактическая инструкция на ассемблере, которая вызывает my_dummy_breakpoint_loc, может быть заменена на «nops» и включена на сайте для каждого сайта путем небольшого изменения кода во время выполнения. Этот метод используется инструментарием разработки ядра Linux, чтобы назвать один пример.

2 голосов
/ 19 апреля 2010

Не имеет прямого отношения к вашему вопросу, но может быть полезным. Вы смотрели на вызовы backtrace и backtrace_symbol в execinfo.h

http://linux.die.net/man/3/backtrace

Это может помочь вам зарегистрировать трассировку, когда ваше условие будет выполнено. Это не GDB, поэтому вы не можете разбить и пройтись по своей программе, но может быть полезен в качестве быстрой диагностики.

2 голосов
/ 19 апреля 2010

GDB поддерживает язык сценариев, который может помочь в подобных ситуациях. Например, вы можете запустить небольшой пользовательский скрипт в точке останова, который (например) может решить «продолжить», потому что какое-то условие не было выполнено.

...