Como localizar o código fonte que implementou um determinado recurso? [fechadas]

14

Eu queria saber quais são algumas técnicas para localizar qual código implementou um recurso específico, em um aplicativo de desktop.

Sou desenvolvedor júnior, com apenas experiência profissional em programação na web. Na Web, é mais fácil fazer isso. Por exemplo, você "inspeciona" um botão com as ferramentas do navegador e pode ver o que está sendo feito ao clicar nele. E, presumindo que você tenha o código fonte completo, você pode detalhar a hierarquia das chamadas.

Mas como você faz isso em aplicativos de desktop? Pelo menos, sem ter que mergulhar na base de código completa?

py_script
fonte
6
Em vez de ler o código, às vezes você pode usar um depurador. Como isso funciona (e como é fácil para você) depende do idioma, depurador e interface do depurador usados. De qualquer forma, usar um depurador é uma arte a ser aprendida - mas, uma vez aprendida, é uma ferramenta muito poderosa. Eu deveria aprender a usar um eu algum tempo.
amon
E onde devo configurar os pontos de interrupção?
py_script
A configuração do ponto de interrupção depende inteiramente do seu aplicativo e de como ele é organizado.
2
Na verdade, pode ser um pouco difícil "inspecionar" e ver onde e como foram feitas as interfaces da Web, com novos sistemas orientados a objetos, como o Backbone.js e modelos, que estão se tornando mais populares.
NoBugs
1
@jeffo Quando você faz, por exemplo, Arquivo-> Abrir em um aplicativo (digamos o LibreOffice's Writer), como você pode encontrar qual é a sequência de chamadas por trás disso?
precisa saber é

Respostas:

21

Rastreamento de volta

O rastreio posterior está localizando um terminal em um evento associado ao recurso (veja abaixo). Uma vez lá, um ponto de interrupção é colocado no depurador. O recurso é acionado e quando o depurador para. A pilha de chamadas é revisada para rastrear novamente o caminho da chamada. Ao subir a pilha de chamadas, você pode fazer anotações sobre estados variáveis ​​ou colocar novos pontos de interrupção para inspecionar o evento novamente.

O recurso é acionado novamente e o depurador para nos novos pontos de interrupção. Você pode repetir o rastreamento de volta ou executar o rastreamento de avanço até que a meta seja encontrada.

Prós e contras

  • É sempre mais fácil subir na pilha de chamadas e ver como você chegou a algum lugar.
  • Pode haver milhões de condições que precisam ser verdadeiras antes de atingir um ponto final. Se você já conhece o endpoint, economizou muito trabalho.
  • Se o recurso estiver quebrado. Você pode nunca chegar ao ponto final e perder tempo tentando descobrir o porquê.

Descoberta do ponto de extremidade

Para depurar um recurso, você precisa saber onde, no código-fonte, o objetivo final é alcançado. Somente a partir deste ponto você pode voltar atrás para ver como o código chegou lá. Um exemplo; Para entender como desfazer é realizado. Você sabe onde no código as coisas são desfeitas, mas não sabe como as coisas chegam lá . Seria um candidato a retroceder para descobrir como o recurso funciona.

Rastreamento para a frente

O rastreio para frente está localizando um ponto inicial para um evento associado a um recurso (veja abaixo). Uma vez lá, as mensagens de log são inseridas no código-fonte ou os pontos de interrupção são definidos. Esse processo é repetido à medida que você avança mais longe do ponto de partida até descobrir a meta do recurso.

Prós e contras

  • É o ponto de partida mais fácil para encontrar um recurso.
  • A complexidade do código reduz a eficácia do rastreamento futuro. Quanto mais condições houver no código, maior a chance de você seguir na direção errada.
  • O rastreamento avançado geralmente resulta na definição de pontos de interrupção que serão acionados por eventos não relacionados. Interrompendo o processo de depuração e interferindo na sua pesquisa.

Descoberta do ponto inicial

Você pode usar palavras-chave, identificadores de interface do usuário (IDs de botões, nomes de janelas) ou fácil de encontrar ouvintes de eventos associados ao recurso. Por exemplo, você pode começar com o botão usado para acionar um recurso de desfazer .

Processo de eliminação

Você pode pensar nisso como o ponto médio em comparação com as posições de ponto inicial e final . Você executa um processo de eliminação quando já sabe que um pedaço de código é usado em um recurso, mas não é o início nem o fim do recurso.

A direção que você toma do ponto médio depende do número de entradas e saídas. Se o pedaço de código for usado em muitos lugares, o rastreamento a partir dessa posição poderá consumir muito tempo, pois todos precisam ser inspecionados. Você então emprega um processo de eliminação para reduzir esta lista. Como alternativa, você pode executar um rastreamento a partir deste ponto, mas novamente se o pedaço de código se ramificar para muitos lugares, isso também pode ser um problema.

Você precisa reduzir as direções da posição, não seguindo caminhos que claramente não seriam executados para o recurso. Passando esse código e colocando apenas pontos de interrupção onde provavelmente está relacionado ao recurso.

A depuração do ponto médio geralmente requer mais recursos IDE avançados. A capacidade de ver hierarquia de código e dependências. Sem essas ferramentas, é difícil de fazer.

Prós e contras

  • Os pontos intermediários costumam ser o primeiro pedaço de código que aparece na sua cabeça quando você pensa no recurso. Você diz para si mesmo "Ah, isso tem que usar XXXX para funcionar".
  • Os pontos do meio podem revelar os pontos de partida da maneira mais fácil.
  • Os pontos intermediários podem ser uma maneira fácil de selecionar a trilha para um recurso quando perdidos por alterações na sincronização ou na segmentação.
  • Os pontos do meio podem levá-lo ao código com o qual você não está familiarizado. Custando-lhe tempo para aprender o que está acontecendo.
Reactgular
fonte
Obrigado Matthew, ótima abordagem. Mas como você encontra um ponto de partida (desculpe se é óbvio para todos, exceto eu)?
precisa saber é o seguinte
@py_script Com qual linguagem de programação você está tendo problemas?
Reactgular
Não se trata de um problema específico que eu tenho, mas a minha principal linguagem de programação Java Desktop é, então vamos ir com ele
py_script
11

Supondo que o recurso esteja vinculado a alguma coisa da interface do usuário, como um botão ou menu, o que costumo fazer é seguir (muito tedioso, mas funciona). Isso está olhando o código-fonte, não usando um depurador .

  1. Procure o texto (possivelmente distinto) no botão, por exemplo, "Super Feature X3".
  2. Isso provavelmente está em um arquivo com alguma constante, por exemplo SUPER_BUTTON_3 = "Super Feature X3". Para referência futura, lembre-se deste nome de arquivo.
  3. Pode haver outra camada (de até duas) de abstração, continue procurando a String "real" que é usada pelo Button. Observe como isso é feito para o futuro.
  4. Agora pesquise nessa constante. Espero que você tenha encontrado o botão. Talvez seja aí que eles conectem o ActionListener. (Estou usando o Java-ese aqui, YMMV, mas o conceito ainda é válido)
  5. Se necessário, pesquise nesse botão e, eventualmente, você descobrirá onde ele está conectado a um ouvinte.
  6. Talvez esse ouvinte realmente redirecione para outros ouvintes (a funcionalidade "real") com base na constante; se assim for, siga a instrução if / else ou case. NOTA : Se houver uma coisa central de expedição, este é um ótimo local para configurar pontos de interrupção .
  7. Finalmente, você deve estar no código real.

Como @amon observou, às vezes um depurador é mais simples ...

user949300
fonte
Interessante ... felizmente tais nomes são normalmente codificados no código :)
py_script
3
  • Se você encontrar algum código relacionado, poderá usar o software de controle de origem para mostrar a confirmação completa ou confirmações próximas que o adicionaram. Isso deve mostrar tudo o que foi necessário para implementar esse recurso.

  • Uma maneira fácil de encontrar um ponto de partida é procurar na sua base de código procurando o texto no botão.

  • Muitas vezes, as pessoas colocam um ID de problema do rastreador de problemas em suas mensagens de confirmação. Se você encontrar um problema descrevendo a solicitação do recurso, poderá procurar confirmações com esse ID de problema.

Michael Burge
fonte
Essa é uma abordagem inteligente, mas acho que funciona apenas em ambientes corporativos. E se você tiver apenas um tarball?
precisa saber é