Как отслеживать изменения переменных в gcc - PullRequest
0 голосов
/ 18 февраля 2011

Можно ли отслеживать, когда и как изменяется переменная?Я пишу на C, используя gcc на Linux

Ответы [ 2 ]

4 голосов
/ 18 февраля 2011

Если вы хотите поместить дополнительный код в вашу программу, которая запускается при изменении переменной, то нет - Standard C не предоставляет способ сделать это. Вы должны найти все места в вашей программе, которые могли бы попытаться изменить значение переменной, и добавить в каждый код какой-нибудь лог. Вы можете сделать это более надежным, переименовав переменную, а затем исправив точки, в которых компиляция прерывается, но это работает только в том случае, если вы можете перекомпилировать весь «клиентский» код, используя переменную: если переменная находится в библиотеке с множеством приложений других людей. используя его, это может быть непрактично.


Использование функций get / set для доступа ...

Иногда хорошей идеей является не писать код, который напрямую использует переменную, а вместо этого предоставлять функции, которые получают и устанавливают значение: тогда вы можете поставить дополнительные проверки или войти в эти функции, если это когда-нибудь станет полезным. Но вы не хотите делать это везде, иначе ваш код будет многословным и медленнее.


Проверка на наличие изменений в переменной ...

Если этого достаточно, чтобы время от времени проверять, то вы можете написать некоторый код, который запускается сигналом таймера / сигнала тревоги или запускается в другом потоке, который периодически проверяет переменную, чтобы увидеть, изменилась ли она, но это не поможет вам узнать, как оно изменилось, и если значение изменяется, но изменяется обратно, вы можете полностью пропустить эти изменения.


Использование C ++

Если вы компилируете свою программу на C ++ (если это возможно, что для небольших программ может даже не потребовать каких-либо изменений в вашем коде), то вы, возможно, можете изменить тип рассматриваемого элемента данных и написать перегруженную функцию operator=() которая будет вызываться при назначении переменной и функции преобразования operator старого типа (), поэтому места, где используется переменная, изменять не нужно:

template <typename T>
class Intercept
{
    Intercept(const T& t) : t_(t) { }
    T& operator=(const T& t) {
        std::cerr << "change " << t_ << " to " << t << '\n'; t_ = t; 
        return *this;
    }
    operator T&() { return t_; }
    operator const T&() const { return t_; }
    T t_;
};

Затем измените, например,

int x;  // from
Intercept<int> x;  // to

Отладчик

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

1 голос
/ 18 февраля 2011

В GDB есть точки разрыва памяти.Я думаю, это именно то, что вы ищете:

Могу ли я установить точку останова для «доступа к памяти» в GDB?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...