2009-02-12 5 views
3

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

Я сейчас в новой компании (код на C++), и я нашел ctags, чтобы заменить некоторые из этих функций. Единственное, что я пропустил, это команда, которую мы назвали «who.calls», в которой перечислены, какие подпрограммы (я имею в виду функции или методы, должны привыкнуть к OO-talk) вызывать данную подпрограмму. Например, если подпрограмма foo вызывает подпрограмму bar:

>who.calls bar 
foo 

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

ответ

5

Возможно, вы захотите рассмотреть вопрос об использовании Doxygen. Он может создавать веб-страницы, которые показывают вам все дерево вызовов и структуру классов, а также вытаскивать правильно отформатированные комментарии для документирования классов и методов, подобных Javadocs для java.

Другая возможность - начать использовать IDE. После 25 лет использования vi (а затем gvim) и ctags я недавно присоединился к 21-му веку и начал использовать Eclipse (я занимаюсь Java, но я видел плагины C++ для Eclipse). Помимо возможности делать все, что могут делать теги, он также может привести вас ко всем вызывающим абонентам текущего метода. И, кроме того, у него есть чертовски хороший встроенный интерактивный отладчик.

+0

Спасибо за редактирование, @ J.F - Я дал вам +1 на одном, где у вас было 9 голосов, чтобы вы получили значок. –

2

SlickEdit может помечать каждый символ в вашем проекте, включая библиотеки, для отображения в «ссылках на шоу». Это будет who.calls плюс один, где плюс - это определение. Это источник на основе.

4

Для использования в командной строке используйте cscope; он должен быть в состоянии ответить на этот вопрос и больше:

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

не написано на C++, но может быть в состоянии справиться поиске ++ кодового C (с some caveats).

Если вы ищете веб-интерфейс, рассмотрите OpenGrok, который запускается на сервере и индексирует вашу систему контроля версий.У него нет поиска, который вы ищете в частности, но он может аппроксимировать его поиском символов.

1

GNU Global выполняет эту работу для меня в системах на базе Unix.

+0

Что бы вы набрали, чтобы получить функцию who.calls с этим? Я думаю, что это близко к тому, что я хочу. –

+0

Это говорит мне, какие файлы содержат вызов функции. Я хочу знать имена функций в тех файлах, которые вызывают мою функцию. –

+0

У них есть демо-версия с кодом ядра Linux - вы можете щелкнуть объявление функции, и оно приведет вас к вызывающим. –

0

Поисковая система с исходным кодом с нулевой погрешностью по адресу SD Source Code Search Engine. Он может обрабатывать многие языки одновременно. Поиски могут выполняться для шаблонов в определенном langauge, или шаблонах на разных языках (например, «найти идентификаторы с использованием TAX»). Чувствительность к токенам langauge уменьшает количество ложных срабатываний, экономит время для пользователя. Он понимает C, C++, C#, COBOL, Java, ECMAScript, Java, XML, Verilog, VHDL и ряд других языков, в том числе FORTRAN.

Его легко найти, кто звонит Х в Фортране с помощью этого инструмента; просто найдите все идентификаторы 'X'. Фактический запрос у вас есть тип: I = X («любой идентификатор с именем X»). Это находит все ссылки на всю базу кода суса.

Смежные вопросы