¿Cómo localizar el código fuente que implementó una determinada característica? [cerrado]

14

Me preguntaba cuáles son algunas técnicas para localizar qué código implementó una característica específica, en una aplicación de escritorio.

Soy un desarrollador junior, con solo experiencia profesional en programación en torno a la programación web. En la Web es más fácil hacer eso. Por ejemplo, "inspecciona" un botón con las herramientas del navegador y puede ver lo que se está haciendo al hacer clic en él. Y luego, suponiendo que tenga el código fuente completo, puede profundizar en la jerarquía de las llamadas.

Pero, ¿cómo se hace esto en las aplicaciones de escritorio? Al menos, sin tener que sumergirse en la base de código completa?

py_script
fuente
66
En lugar de leer el código, a veces puede usar un depurador. Cómo funciona eso (y qué tan fácil de usar es para usted) depende del idioma, el depurador y la interfaz del depurador utilizada. En cualquier caso, usar un depurador es un arte para aprender, pero una vez que se aprende es una herramienta muy poderosa. Debería aprender a usar uno yo mismo alguna vez.
amon
¿Y dónde debo configurar los puntos de interrupción?
py_script
La configuración del punto de interrupción depende completamente de su aplicación y de cómo está organizada.
2
En realidad, puede ser algo difícil "inspeccionar" y ver dónde y cómo se hicieron las interfaces web, con nuevos sistemas orientados a objetos como Backbone.js y plantillas, que se están volviendo más populares.
NoBugs
1
@jeffo Cuando lo hace, por ejemplo, Archivo-> Abrir en una aplicación (digamos el Escritor de LibreOffice), ¿cómo puede encontrar cuál es la secuencia de llamadas detrás de eso?
py_script

Respuestas:

21

Rastreo de la espalda

El rastreo posterior es localizar un punto final a un evento asociado con la función (ver más abajo). Una vez allí, se coloca un punto de interrupción en el depurador. La función se activa y cuando se detiene el depurador. La pila de llamadas se revisa para rastrear la ruta de llamada. Mientras camina por la pila de llamadas, puede tomar notas sobre estados variables o colocar nuevos puntos de interrupción para inspeccionar el evento nuevamente.

La característica se activa nuevamente y el depurador se detiene en los nuevos puntos de interrupción. Luego puede repetir el rastreo hacia atrás o realizar el rastreo hacia adelante hasta encontrar el objetivo.

Pros contras

  • Siempre es más fácil subir la pila de llamadas y ver cómo llegaste a algún lado.
  • Podría haber millones de condiciones que deben ser ciertas antes de llegar a un punto final. Si ya conoce el punto final, se ha ahorrado mucho trabajo.
  • Si la función está rota. Es posible que nunca llegue al punto final, y puede perder el tiempo tratando de descubrir por qué.

Descubrimiento de punto final

Para depurar una función, debe saber en qué parte del código fuente se alcanza el objetivo final. Solo desde este punto puede retroceder para ver cómo llegó el código allí. Un ejemplo; Para entender cómo se realiza deshacer. Sabes en qué parte del código se deshacen las cosas, pero no sabes cómo llegan las cosas allí . Este sería un candidato para retroceder para descubrir cómo funciona la característica.

Seguimiento hacia adelante

El seguimiento hacia adelante es localizar un punto de inicio para un evento asociado con una función (ver más abajo). Una vez allí, los mensajes de registro se insertan en el código fuente o se establecen puntos de interrupción. Este proceso se repite a medida que avanza más lejos del punto de inicio hasta que descubre el objetivo de la función.

Pros contras

  • Es el punto de partida más fácil para encontrar una función.
  • La complejidad del código reduce la efectividad del rastreo hacia adelante. Cuantas más condiciones haya en el código, mayores serán las posibilidades de que vaya en la dirección equivocada.
  • El seguimiento directo a menudo da como resultado el establecimiento de puntos de interrupción que se desencadenarán por eventos no relacionados. Interrumpir el proceso de depuración e interferir con su búsqueda.

Punto de inicio de descubrimiento

Puede usar palabras clave, identificadores de interfaz de usuario (ID de botones, nombres de ventanas) o oyentes de eventos fáciles de encontrar asociados con la función. Por ejemplo, puede comenzar con el botón utilizado para activar una función de deshacer .

Proceso de eliminación

Puede pensar en esto como el punto medio en comparación con las posiciones de punto inicial y final . Realiza un proceso de eliminación cuando ya sabe que se utiliza un fragmento de código en una característica, pero no es ni el inicio ni el final de la característica.

La dirección que tome desde el punto medio depende del número de entradas y salidas. Si el fragmento de código se usa en muchos lugares, entonces el rastreo desde esta posición puede llevar mucho tiempo, ya que todos deben ser inspeccionados. Luego emplea un proceso de eliminación para reducir esta lista. Alternativamente, puede realizar un rastreo hacia adelante desde este punto, pero nuevamente si el fragmento de código se ramifica en muchos lugares, esto también puede ser un problema.

Debe reducir las direcciones de posición al no seguir rutas que claramente no se ejecutarían para la función. Pasando este código y solo colocando puntos de interrupción donde probablemente esté relacionado con la característica.

La depuración del punto medio a menudo requiere características IDE más avanzadas. La capacidad de ver la jerarquía de código y las dependencias. Sin esas herramientas es difícil de hacer.

Pros contras

  • Los puntos intermedios son a menudo la primera porción de código que aparece en tu cabeza cuando piensas en la característica. Te dices a ti mismo "Ah, eso tiene que usar XXXX para trabajar".
  • Los puntos intermedios pueden revelar los puntos de inicio de la forma más fácil.
  • Los puntos intermedios pueden ser una manera fácil de retomar el camino hacia una característica cuando se pierde por sincronización o cambios de subprocesos.
  • Los puntos intermedios pueden llevarlo a un código con el que no está familiarizado. Le cuesta tiempo aprender lo que está sucediendo.
Reactgular
fuente
Gracias Matthew, gran enfoque. Pero, ¿cómo encuentras un punto de partida (perdón si es obvio para todos menos para mí)?
py_script
@py_script ¿Con qué lenguaje de programación tiene problemas?
Reactgular
No se trata de un problema específico que tengo, pero mi lenguaje de programación de escritorio principal es Java, así que vamos con él
py_script
11

Suponiendo que la función está vinculada a algunas cosas de la interfaz de usuario, como un botón o menú, lo que tiendo a hacer sigue (muy tedioso pero funciona). Esto está mirando a través del Código Fuente, no usando un depurador .

  1. Busque el texto (con suerte distintivo) en el botón, por ejemplo, "Super Feature X3".
  2. Eso es probablemente en un archivo con alguna constante, por ejemplo SUPER_BUTTON_3 = "Super Feature X3". Para referencia futura, recuerde este nombre de archivo.
  3. Puede haber otra capa (de incluso dos) de abstracción, siga buscando para obtener la cadena "real" que utiliza el botón. Tenga en cuenta cómo se hace esto para el futuro.
  4. Ahora busca en esa constante. Esperemos que haya encontrado el botón. Quizás ahí es donde conectan el ActionListener. (Estoy tomando Java-ese aquí, YMMV, pero el concepto aún se mantiene)
  5. Si es necesario, busque ese botón y eventualmente encontrará dónde se conecta a un oyente.
  6. Quizás ese oyente realmente redirige a otros oyentes (la funcionalidad "real") basándose en la constante, si es así, siga esa afirmación if / else o case. NOTA : Si hay una cosa central de despacho, este es un gran lugar para configurar puntos de interrupción .
  7. Finalmente, deberías estar en el código real.

Como señaló @amon, a veces un depurador es más simple ...

user949300
fuente
Interesante ... afortunadamente, tales nombres generalmente están codificados en el código :)
py_script
3
  • Si puede encontrar algún código relacionado, puede usar su software de control de origen para mostrarle el compromiso completo o los compromisos cercanos que lo agregaron. Eso debería mostrarle todo lo que se requería para implementar esa característica.

  • Una manera fácil de encontrar algún punto de partida para buscar sería buscar en su base de código buscando el texto en el botón.

  • A menudo, las personas colocarán una identificación de problema de su rastreador de problemas en sus mensajes de confirmación. Si puede encontrar un problema que describa la solicitud de función, puede buscar confirmaciones con esa identificación de problema.

Michael Burge
fuente
Es un enfoque inteligente, pero creo que solo funciona en entornos corporativos. ¿Qué pasa si solo tienes un tarball?
py_script