Мое предложение: вместо того, чтобы пытаться отслеживать номера строк, которые, как вы заметили, могут быстро выйти из синхронизации при изменении программного обеспечения, вы должны украшать каждое утверждение (или другую интересующую строку) уникальным идентификатором .
Предполагая, что вы используете C, в случае утверждений это может быть так же просто, как изменить что-то вроде assert(x == 42);
на assert(("check_x", x == 42));
- это функционально идентично из-за семантики оператора запятой в C и тот факт, что строковый литерал всегда будет иметь значение true.
Конечно, это означает, что вам необходимо идентифицировать априори те элементы, которые вы хотите отслеживать. Но, учитывая, что не существует в общем надежного способа сопоставления номеров строк исходного кода по версиям (под этим я подразумеваю, что для любого механизма, который вы могли бы предложить, я полагаю, что я мог бы предложить ситуацию, в которой этот механизм делает неправильную вещь), я бы сказал, лучшее, что вы можете сделать.
Еще одна идея: если вы используете C ++, вы можете использовать RAII для очень элегантного отслеживания динамических областей. По сути, у вас есть класс Track
, конструктор которого берет строку, описывающую область действия, и добавляет ее в глобальный стек активных в настоящее время областей. Деструктор Track
выталкивает верхний элемент из стека. Последний компонент - статическая функция Track::getState()
, которая просто возвращает список всех активных в данный момент областей - это можно вызвать из обработчика исключений или другого механизма обработки ошибок.