Як знайти вихідний код, який реалізував певну функцію? [зачинено]


14

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

Я молодший розробник, маючи лише досвід професійного програмування, що лежить навколо веб-програмування. У Мережі це зробити простіше. Наприклад, ви "оглядаєте" кнопку з інструментами браузера, і ви можете бачити, що робиться при натисканні на неї. І тоді, припускаючи, що ви маєте повний вихідний код, ви можете розширити ієрархію викликів.

Але як це зробити у настільних додатках? Принаймні, не занурюючись у повну базу коду?


6
Замість читання коду іноді можна використовувати налагоджувач. Те, як це працює (і як зручний для вас користувач), залежить від мови, інтерфейсу налагодження та інтерфейсу налагодження. У будь-якому випадку, використання налагоджувача - це мистецтво, яке потрібно вивчити, але колись він дізнається, це дуже потужний інструмент. Я мав би навчитися деякий час користуватися собою.
амон

І де мені встановити точки прориву?
py_script

Налаштування точки перерви повністю залежить від вашої програми та способу її організації.

2
Насправді "перевірити" і дізнатися, де і як були зроблені веб-інтерфейси, насправді може бути дещо складно з новими об'єктно-орієнтованими системами, такими як Backbone.js та шаблонами, які стають все більш популярними.
NoBugs

1
@jeffo Якщо, наприклад, у програмі «Файл»> «Відкрити» (скажімо, «Writer LibreOffice»), як ви можете знайти, яка за цим послідовність дзвінків?
py_script

Відповіді:


21

Зворотний трекінг

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

Функція запускається знову, і налагоджувач зупиняється на нових точках розриву. Потім ви можете повторити калькування назад або виконати трасування вперед, поки мета не буде знайдена.

Плюси мінуси

  • Завжди простіше підійти до стеку викликів і побачити, як ти кудись потрапив.
  • Можуть бути мільйони умов, які повинні бути справдими, перш ніж досягти кінцевої точки. Якщо ви вже знаєте кінцеву точку, ви зберегли себе багато роботи.
  • Якщо функція порушена. Ви ніколи не зможете досягти кінцевої точки, і час можна витратити, намагаючись з’ясувати, чому.

Кінцева точка відкриття

Для налагодження функції ви повинні знати, де у вихідному коді досягнута кінцева мета. Тільки з цього моменту ви можете відслідковувати, щоб побачити, як код потрапив туди. Приклад; Щоб зрозуміти, як виконується скасування. Ви знаєте, де в коді речі відмінені, але ви не знаєте, як вони дістаються . Це було б кандидатом на зворотній шлях, щоб зрозуміти, як працює ця функція.

Відстеження вперед

Відстежування вперед - це місце початку події, пов’язаної з особливістю (див. Нижче). Потрапивши туди, повідомлення в журнал вставляються у вихідний код або встановлюються точки перерви. Цей процес повторюється в міру просування далі від початкової точки, поки ви не виявите мету для функції.

Плюси мінуси

  • Це найпростіша відправна точка для пошуку функції.
  • Складність коду знижує ефективність прямого відстеження. Чим більше умов у коді, тим більше шансів піти в неправильному напрямку.
  • Відстеження вперед часто призводить до встановлення точок перерви, які будуть спровоковані непов'язаними подіями. Перервати процес налагодження та заважати вашому пошуку.

Відкриття початкової точки

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

Процес усунення

Ви можете вважати це середньою точкою порівняно з початковою і кінцевою позиціями. Ви виконуєте процес усунення, коли вже знаєте, що фрагмент коду використовується в функції, але це не є ні початком, ні кінцем функції.

Напрямок, який ви приймаєте від середньої точки, залежить від кількості входів і виходів. Якщо фрагмент коду використовується в багатьох місцях, то відстеження назад з цієї позиції може зайняти дуже багато часу, оскільки їх потрібно перевірити. Потім ви використовуєте процес усунення, щоб зменшити цей список. Крім того, з цього моменту ви можете виконати трасування прямого напрямку , але знову ж таки, якщо фрагмент коду розгалужиться на багато місць, це також може бути проблемою.

Ви повинні зменшити вказівки щодо позиції, не дотримуючись шляхів, які явно не будуть виконані для функції. Проходячи повз цей код і розміщуючи лише точки перелому, якщо це, ймовірно, пов’язано з функцією.

Налагодження середньої точки часто вимагає більш попередніх функцій IDE. Можливість бачити ієрархію коду та залежності. Без цих інструментів важко обійтися.

Плюси мінуси

  • Середні точки часто є першим кодом коду, який вискакує вам у голову, коли ви думаєте про функцію. Ви кажете собі "Ах, для роботи потрібно використовувати XXXX".
  • Середні точки можуть виявити початкові точки найлегше.
  • Середні точки можуть бути простим способом підняти слід до функції, коли вони втрачені синхронізацією або зміною нитки.
  • Середні моменти можуть привести вас до коду, який вам не знайомий. Ви витрачаєте час, щоб дізнатися, що відбувається.

Дякую Метью, чудовий підхід. Але як знайти точку відліку (вибачте, якщо це очевидно для всіх, крім мене)?
py_script

@py_script З якою мовою програмування у вас виникають проблеми?
Реакційний

Мова не йде про конкретну проблему, яку я маю, але головна моя мова програмування настільних - Java, тому давайте перейдемо з нею
py_script

11

Якщо припустити, що функція пов'язана з деяким інтерфейсом інтерфейсу користувача, як кнопкою або меню, то, що я, як правило, слід робити (дуже нудно, але це працює). Це переглядається через вихідний код, не використовується налагоджувач .

  1. Шукайте текст (сподіваюся, відмінний) на кнопці, наприклад, "Super Feature X3".
  2. Це, ймовірно, у файлі з якоюсь постійною, наприклад SUPER_BUTTON_3 = "Super Feature X3". Для подальшого ознайомлення запам'ятайте це ім'я файлу.
  3. Може бути ще один шар (навіть з двох) абстракції, продовжуйте пошук, щоб отримати "справжню" Рядок, який використовує кнопка. Зверніть увагу, як це робиться на майбутнє.
  4. Тепер шукайте на цій константі. Сподіваємось, ви зараз знайшли кнопку. Можливо, саме там вони підключають ActionListener. (Я беру тут Java-ese, YMMV, але концепція все-таки дотримується)
  5. Якщо потрібно, виконайте пошук по цій кнопці, і ви врешті знайдете, де вона підключиться до слухача.
  6. Можливо, цей слухач дійсно переспрямовує інших слухачів ("справжній" функціонал) на основі постійної, якщо так, дотримуйтесь цього, якщо / else або випадок випадку. ПРИМІТКА . Якщо є центральна диспетчерська річ, це чудове місце для встановлення точок прориву .
  7. Нарешті, ви повинні мати фактичний код.

Як зазначав @amon, іноді налагоджувач простіше ...


Цікавий один… на щастя, такі імена зазвичай
кодуються

3
  • Якщо ви взагалі можете знайти будь-який пов’язаний код, ви можете скористатись програмним забезпеченням для керування джерелом, щоб показати вам всю комісію чи поруч із ними комісії, які додали її. Це повинно показати вам все, що потрібно для реалізації цієї функції.

  • Одним із простих способів знайти деяку вихідну точку, щоб подивитися, було б проглядати свою кодову базу, шукаючи текст на кнопці.

  • Часто люди ставлять ідентифікатор проблеми зі свого трекера випуску у своїх повідомленнях про фіксацію. Якщо ви можете знайти проблему, що описує запит на функцію, ви можете шукати комісії з цим ідентифікатором проблеми.


Це розумний підхід, але я думаю, що він працює лише у корпоративних умовах. Що робити, якщо у вас просто тарбол?
py_script
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.