Кросс версия соответствия строк - PullRequest
1 голос
/ 09 апреля 2010

Я думаю о том, как сделать автоматическое отслеживание ошибок, и в связи с этим мне интересно, что доступно для соответствия номерам строк исходного кода (или более точным числам, отображаемым из указателей инструкций через что-то вроде addr2line) в одной версии программы в той же строке в другой. (Предположим, что все находится в каком-то исходном контроле и доступно для моего кода)

Простейшим подходом было бы использовать diff-файл / lib для файлов и выполнить некоторые математические операции с интервалами номеров строк, однако это имеет некоторые ограничения:

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

Прежде чем начать заниматься чем-то лучшим:

  • Что уже существует для этого?
  • Какими функциями обладает подобная система, о которой я даже не думал?

Ответы [ 2 ]

0 голосов
/ 18 апреля 2010

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

Предполагая, что вы используете C, в случае утверждений это может быть так же просто, как изменить что-то вроде assert(x == 42); на assert(("check_x", x == 42)); - это функционально идентично из-за семантики оператора запятой в C и тот факт, что строковый литерал всегда будет иметь значение true.

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

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

0 голосов
/ 09 апреля 2010

Зачем вам это нужно? Если вы используете достойный контроль версий исходного кода, у вас должен быть доступ к старым версиям кода, вы можете просто предоставить ссылку на него, чтобы люди могли увидеть ошибку в ее первоначальном месте. На самом деле главная проблема, которую я вижу с этой системой, заключается в том, что ошибка, возможно, уже исправлена, но ваш код автоматического отслеживания линии укажет на строку и скажет, что там есть ошибка. Кажется, эту систему будет сложно создать, и она не окажет большую помощь на практике.

...