Как найти исходный код, который реализовал определенную функцию? [закрыто]

14

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

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

Но как вы делаете это в настольных приложениях? По крайней мере, без необходимости погружаться в полную кодовую базу?

py_script
источник
6
Вместо чтения кода вы можете иногда использовать отладчик. Как это работает (и насколько это удобно для вас) зависит от используемого языка, отладчика и интерфейса отладчика. В любом случае, использование отладчика - это искусство, которое нужно освоить, но как только оно освоено, это очень мощный инструмент. Я должен научиться использовать его сам когда-нибудь.
Am
И где я должен установить контрольные точки?
py_script
Настройка точки останова полностью зависит от вашего приложения и от того, как оно организовано.
2
На самом деле может быть довольно сложно «проверить» и посмотреть, где и как были созданы веб-интерфейсы, с новыми объектно-ориентированными системами, такими как Backbone.js и шаблоны, которые становятся все более популярными.
NoBugs
1
@jeffo Когда вы делаете, например, File-> Open в приложении (скажем, Writer LibreOffice), как вы можете найти последовательность вызовов за этим?
py_script

Ответы:

21

Трассировка назад

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

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

За и против

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

Обнаружение конечной точки

Для отладки функции вы должны знать, где в исходном коде достигнута конечная цель. Только с этого момента вы можете трассировку , чтобы увидеть , как код попал. Пример; Чтобы понять, как выполняется отмена. Вы знаете, где в коде все отменено, но вы не знаете, как это происходит . Это было бы кандидатом на обратный путь, чтобы выяснить, как работает эта функция.

Прямая трассировка

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

За и против

  • Это самая легкая отправная точка для поиска функции.
  • Сложность кода снижает эффективность прямой трассировки. Чем больше условий в коде, тем больше вероятность, что вы пойдете в неверном направлении.
  • Прямое отслеживание часто приводит к установке точек останова, которые будут вызваны несвязанными событиями. Прерывание процесса отладки и вмешательство в ваш поиск.

Начальная точка Discovery

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

Процесс ликвидации

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

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

Вы должны уменьшить направления положения, не следуя путям, которые явно не будут выполняться для объекта. Переходя мимо этого кода и устанавливая точки останова только там, где он, скорее всего, связан с этой функцией.

Отладка средней точки часто требует более продвинутых возможностей IDE. Способность видеть иерархию кода и зависимости. Без этих инструментов это сложно сделать.

За и против

  • Средние точки часто являются первым кусочком кода, который всплывает в вашей голове, когда вы думаете об этой функции. Вы говорите себе: «Ах, это должно использовать XXXX, чтобы работать».
  • Средние точки могут выявить начальные точки легче всего.
  • Средние точки могут быть простым способом найти след к объекту, если он потерян из-за синхронизации или изменения потоков.
  • Средние точки могут привести вас к коду, с которым вы не знакомы. Стоит вам времени, чтобы узнать, что происходит.
Reactgular
источник
Спасибо Мэтью, отличный подход. Но как найти начальную точку (извините, если она очевидна для всех, кроме меня)?
py_script
@py_script С каким языком программирования у вас проблемы?
Reactgular
Речь идет не о конкретной проблеме, но моим основным языком программирования для настольных компьютеров является Java, так что давайте пойдем с этим
py_script
11

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

  1. Найдите (возможно, отличительный) текст на кнопке, например «Super Feature X3».
  2. Это, вероятно, в файле с некоторой константой, например SUPER_BUTTON_3 = "Super Feature X3". Для дальнейшего использования запомните это имя файла.
  3. Может быть другой слой (даже два) абстракции, продолжайте поиск, чтобы получить «настоящую» строку, которая используется Button. Обратите внимание, как это делается на будущее.
  4. Теперь поиск по этой константе. Надеюсь, теперь вы нашли кнопку. Может быть, именно здесь они подключают ActionListener. (Я беру Java-ese здесь, YMMV, но концепция все еще держится)
  5. При необходимости выполните поиск по этой кнопке, и вы в конце концов найдете, где она подключена к слушателю.
  6. Возможно, этот слушатель действительно перенаправляет другим слушателям («настоящая» функциональность) на основе константы, если так, следуйте этому if / else или выражению case. ПРИМЕЧАНИЕ . Если есть центральная диспетчерская функция, это отличное место для установки точек останова .
  7. Наконец, вы должны быть на самом коде.

Как заметил @amon, иногда отладчик проще ...

user949300
источник
Интересный ... к счастью, такие имена обычно жестко закодированы в коде :)
py_script
3
  • Если вы вообще можете найти какой-либо связанный код, вы можете использовать программное обеспечение контроля версий, чтобы показать вам весь коммит или близлежащие коммиты, которые его добавили. Это должно показать вам все, что требуется для реализации этой функции.

  • Один из простых способов найти начальную точку поиска - поиск по тексту на кнопке.

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

Майкл Бёрдж
источник
Это разумный подход, но я думаю, что он работает только в корпоративной среде. Что делать, если у вас есть только тарбол?
py_script