Comment localiser le code source qui a implémenté une certaine fonctionnalité? [fermé]

14

Je me demandais quelles sont les techniques pour localiser quel code implémentait une fonctionnalité spécifique, sur une application de bureau.

Je suis un développeur junior, avec seulement une expérience de programmation professionnelle se situant autour de la programmation Web. Sur le Web, il est plus facile de le faire. Par exemple, vous "inspectez" un bouton avec les outils du navigateur et vous pouvez voir ce qui se fait lorsque vous cliquez dessus. Et puis, en supposant que vous disposez du code source complet, vous pouvez explorer la hiérarchie des appels.

Mais comment faites-vous cela dans les applications de bureau? Au moins, sans avoir à plonger dans la base de code complète?

py_script
la source
6
Au lieu de lire le code, vous pouvez parfois utiliser un débogueur. Le fonctionnement (et la convivialité pour vous) dépendent de la langue, du débogueur et de l'interface de débogage utilisés. Dans tous les cas, l'utilisation d'un débogueur est un art à apprendre - mais une fois appris, c'est un outil très puissant. Je devrais apprendre à en utiliser un moi-même quelque temps.
amon
Et où dois-je configurer les points d'arrêt?
py_script
La configuration du point d'arrêt dépend entièrement de votre application et de son organisation.
2
Il peut en fait être quelque peu difficile à «inspecter» et à voir où et comment les interfaces Web ont été créées, avec de nouveaux systèmes orientés objet tels que Backbone.js et des modèles, qui deviennent de plus en plus populaires.
NoBugs
1
@jeffo Lorsque vous faites, par exemple, Fichier-> Ouvrir dans une application (disons Writer de LibreOffice), comment pouvez-vous trouver quelle est la séquence d'appels derrière cela?
py_script

Réponses:

21

Traçage arrière

Le suivi arrière consiste à localiser un point d' extrémité à un événement associé à la fonction (voir ci-dessous). Une fois sur place, un point d'arrêt est placé dans le débogueur. La fonctionnalité est déclenchée et lorsque le débogueur s'arrête. La pile d'appels est revue pour retracer le chemin d'appel. En remontant la pile d'appels, vous pouvez prendre des notes sur les états variables ou placer de nouveaux points d'arrêt pour inspecter à nouveau l'événement.

La fonctionnalité est à nouveau déclenchée et le débogueur s'arrête aux nouveaux points d'arrêt. Vous pouvez ensuite répéter le traçage arrière ou effectuer un traçage avant jusqu'à ce que l'objectif soit trouvé.

Avantages et inconvénients

  • Il est toujours plus facile de remonter la pile d'appels et de voir comment vous êtes arrivé quelque part.
  • Il pourrait y avoir des millions de conditions qui doivent être remplies avant d'atteindre un point final. Si vous connaissez déjà le point final, vous vous êtes épargné beaucoup de travail.
  • Si la fonctionnalité est cassée. Il est possible que vous n'atteigniez jamais le point final et que vous perdiez du temps à essayer de comprendre pourquoi.

Découverte de point de terminaison

Pour déboguer une fonctionnalité, vous devez savoir où dans le code source l'objectif final est atteint. Ce n'est qu'à partir de ce point que vous pouvez revenir en arrière pour voir comment le code y est arrivé. Un exemple; Comprendre comment l'annulation est effectuée. Vous savez où dans le code les choses sont annulées, mais vous ne savez pas comment les choses y arrivent . Ce serait un candidat pour un retour en arrière afin de comprendre comment la fonctionnalité fonctionne.

Tracé vers l'avant

Le suivi vers l'avant consiste à localiser un point de départ pour un événement associé à une fonction (voir ci-dessous). Une fois sur place, des messages de journalisation sont insérés dans le code source ou des points d'arrêt sont définis. Ce processus est répété à mesure que vous vous éloignez du point de départ jusqu'à ce que vous découvriez l' objectif de la fonctionnalité.

Avantages et inconvénients

  • C'est le point de départ le plus simple pour trouver une fonction.
  • La complexité du code réduit l'efficacité du suivi direct. Plus il y a de conditions dans le code, plus vous avez de chances d'aller dans la mauvaise direction.
  • Le suivi direct entraîne souvent la définition de points d'arrêt qui seront déclenchés par des événements non liés. Interrompre le processus de débogage et interférer avec votre recherche.

Découverte du point de départ

Vous pouvez utiliser des mots clés, des identifiants d'interface utilisateur (identifiants de bouton, noms de fenêtres) ou des écouteurs d'événements faciles à trouver associés à la fonction. Par exemple, vous pouvez commencer par le bouton utilisé pour déclencher une fonction d' annulation .

Processus d'élimination

Vous pouvez considérer cela comme le point milieu par rapport aux positions de point de départ et de fin . Vous effectuez un processus d'élimination lorsque vous savez déjà qu'un morceau de code est utilisé dans une fonctionnalité, mais ce n'est ni le début ni la fin de la fonctionnalité.

La direction que vous prenez à partir du point médian dépend du nombre d'entrées et de sorties. Si le bloc de code est utilisé à de nombreux endroits, le traçage arrière à partir de cette position peut prendre beaucoup de temps car ils doivent tous être inspectés. Vous utilisez ensuite un processus d'élimination pour réduire cette liste. Alternativement, vous pouvez effectuer une trace directe à partir de ce point, mais encore une fois si le bloc de code se ramifie à de nombreux endroits, cela peut également être un problème.

Vous devez réduire les directions de position en ne suivant pas les chemins qui ne seraient clairement pas exécutés pour la fonction. Dépasser ce code et ne placer que des points d'arrêt là où ils sont probablement liés à la fonctionnalité.

Le débogage du point intermédiaire nécessite souvent des fonctionnalités IDE plus avancées. La possibilité de voir la hiérarchie du code et les dépendances. Sans ces outils, c'est difficile à faire.

Avantages et inconvénients

  • Les points médians sont souvent le premier morceau de code qui vous vient à l'esprit lorsque vous pensez à la fonctionnalité. Vous vous dites "Ah, ça doit utiliser XXXX pour fonctionner."
  • Les points intermédiaires peuvent révéler les points de départ les plus faciles.
  • Les points médians peuvent être un moyen facile de retrouver la trace d'une entité lorsqu'elle est perdue par des changements de synchronisation ou de thread.
  • Les points intermédiaires peuvent vous amener à coder que vous ne connaissez pas. Vous coûter du temps pour apprendre ce qui se passe.
Reactgular
la source
Merci Matthew, excellente approche. Mais comment trouvez-vous un point de départ (désolé si c'est évident pour tout le monde sauf moi)?
py_script
@py_script Avec quel langage de programmation rencontrez-vous des problèmes?
Reactgular
Il ne s'agit pas d'un problème spécifique que j'ai, mais mon langage de programmation Desktop principal est Java, alors allons-y
py_script
11

En supposant que la fonctionnalité est liée à quelque chose d'interface utilisateur, comme un bouton ou un menu, ce que j'ai tendance à faire suit (très fastidieux mais cela fonctionne). C'est en parcourant le code source, sans utiliser de débogueur .

  1. Recherchez le texte (si tout va bien) distinctif sur le bouton, par exemple "Super Feature X3".
  2. C'est probablement dans un fichier avec une constante, par exemple SUPER_BUTTON_3 = "Super Feature X3". Pour référence future, n'oubliez pas ce nom de fichier.
  3. Il peut y avoir une autre couche (voire deux) d'abstraction, continuez à chercher pour obtenir la "vraie" chaîne utilisée par le bouton. Notez comment cela se fait pour l'avenir.
  4. Maintenant, recherchez cette constante. J'espère que vous avez maintenant trouvé le bouton. C'est peut-être là qu'ils connectent l'ActionListener. (Je prends Java-ese ici, YMMV, mais le concept tient toujours)
  5. Si nécessaire, recherchez sur ce bouton et vous finirez par trouver où il se connecte à un écouteur.
  6. Peut-être que cet auditeur redirige vraiment vers d'autres écouteurs (la "vraie" fonctionnalité) en fonction de la constante, si c'est le cas, suivez cette instruction if / else ou case. REMARQUE : S'il y a un problème de répartition centrale, c'est un excellent endroit pour configurer des points d'arrêt .
  7. Enfin, vous devriez être au code réel.

Comme l'a noté @amon, parfois un débogueur est plus simple ...

user949300
la source
Intéressant ... heureusement, ces noms sont généralement codés en dur dans le code :)
py_script
3
  • Si vous pouvez trouver un code connexe, vous pouvez utiliser votre logiciel de contrôle de source pour vous montrer le commit complet ou les commits à proximité qui l'ont ajouté. Cela devrait vous montrer tout ce qui était nécessaire pour implémenter cette fonctionnalité.

  • Un moyen facile de trouver un point de départ à rechercher serait de parcourir votre base de code à la recherche du texte sur le bouton.

  • Souvent, les gens mettent un identifiant de problème depuis leur outil de suivi des problèmes dans leurs messages de validation. Si vous pouvez trouver un problème décrivant la demande de fonctionnalité, vous pouvez rechercher des validations avec cet identifiant de problème.

Michael Burge
la source
C'est une approche intelligente, mais je pense qu'elle ne fonctionne que sur les environnements d'entreprise. Et si vous n'avez qu'une tarball?
py_script