如何找到实现特定功能的源代码?[关闭]


14

我想知道有什么技术可以在桌面应用程序上找到哪些代码实现了特定功能。

我是一名初级开发人员,仅具有围绕Web编程的专业编程经验。在Web中,这样做更容易。例如,您使用浏览器工具“检查”按钮,然后单击该按钮即可看到正在执行的操作。然后,假设您拥有完整的源代码,则可以深入了解调用的层次结构。

但是如何在桌面应用程序中做到这一点?至少不必深入研究完整的代码库?


6
有时您可以使用调试器来代替阅读代码。它的工作方式(以及对用户的友好程度)取决于所使用的语言,调试器和调试器界面。无论如何,使用调试器都是要学习的技巧-但是一旦了解,它便是一个非常强大的工具。我应该学会一段时间使用自己。
阿蒙2014年

我应该在哪里设置断点?
py_script 2014年

断点的设置完全取决于您的应用程序及其组织方式。

2
实际上,使用Backbone.js和模板等新的面向对象的系统变得越来越流行,实际上很难“检查”并查看在何处以及如何制作Web界面。
NoBugs 2014年

1
@jeffo例如,在应用程序中执行File-> Open时(例如说LibreOffice的Writer),如何找到其背后的调用顺序?
py_script 2014年

Answers:


21

回溯

追溯是将端点定位到与功能关联的事件(请参见下文)。到达那里后,将一个断点放置在调试器中。该功能会在调试器停止时触发。检查调用堆栈以追溯跟踪调用路径。在调用堆栈上移动时,您可以记下可变状态,或放置新的断点以再次检查事件。

该功能再次被触发,调试器在新的断点处停止。然后,您可以重复向后跟踪或执行向前跟踪,直到找到目标为止。

优点缺点

  • 走到调用堆栈并查看如何到达总是容易的。
  • 可能需要数百万个条件才能达到端点。如果您已经知道端点,则可以节省很多工作。
  • 如果功能损坏。您可能永远都无法到达端点,并且浪费时间试图找出原因。

端点发现

要调试功能,您必须知道在源代码中的最终目标。只有从这一点开始,您才能回溯以查看代码如何到达那里。一个例子; 了解如何执行撤消。您知道事情在代码中的何处被撤消,但是您不知道事情如何到达那里。这将是回溯以确定功能如何工作的候选者。

前向追踪

前向跟踪正在为与功能关联的事件定位起点(请参见下文)。到达该位置后,会将日志记录消息插入源代码或设置断点。随着您离起点的进一步发展,重复此过程,直到您发现该功能的目标

优点缺点

  • 这是找到功能的最简单起点。
  • 代码复杂度降低了前向跟踪的效率。代码中存在的条件越多,您走错方向的机会就越大。
  • 前向跟踪通常会导致设置断点,该断点将由不相关的事件触发。中断调试过程并干扰您的搜索。

起点发现

您可以使用关键字,用户界面标识符(按钮ID,窗口名称),也可以轻松找到与该功能关联的事件侦听器。例如,您可以从用于触发撤消功能的按钮开始。

排除法

您可以将其视为与起点终点位置相比的中间点。当您已经知道某个功能中使用了一段代码,但是您既不是功能的开始也不是结束时,则执行消除过程。

您从中间点走的方向取决于入口和出口的数量。如果在很多地方都使用了代码块,那么从该位置进行追溯将非常耗时,因为必须对它们全部进行检查。然后,您采用消除方法来减少此列表。或者,您可以从这一点开始执行前向跟踪,但是如果代码块分支到很多地方,这也是一个问题。

您必须通过不遵循明显不会对该功能执行的路径来减少位置方向。跳过此代码,仅在可能与功能相关的位置放置断点。

中点调试通常需要更高级的IDE功能。查看代码层次结构和依赖性的能力。没有这些工具,很难做到。

优点缺点

  • 当您想到该功能时,中间点通常是突然出现在您脑海中的第一批代码。您对自己说:“啊,必须使用XXXX才能起作用。”
  • 中间点可以最容易地揭示起点
  • 当由于同步或线程更改而丢失时,中间点是获取功能要素的简便方法。
  • 中间点可以带您去编写您不熟悉的代码。花费您时间去了解正在发生的事情。

感谢马修,很棒的方法。但是,您如何找到起点(对不起,除了我以外,对所有人而言都是显而易见的)?
py_script 2014年

@py_script您遇到什么编程语言?
Reactgular 2014年

它与我所遇到的特定问题无关,但是我的主要桌面编程语言是Java,所以就随它去吧
py_script 2014年

11

假设该功能与某个UI东西绑定在一起,例如Button或Menu,那么我倾向于这样做(非常乏味,但它可以工作)。这是在查看源代码,而不是使用调试器

  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所指出的,有时调试器会更简单...


有趣的是...谢天谢地,这样的名称通常在代码中硬编码:)
py_script

3
  • 如果您根本找不到任何相关代码,则可以使用源代码控制软件向您显示添加了该代码的整个提交或附近的提交。那应该向您显示实现该功能所需的一切。

  • 一种简单的查找起点的方法是在您的代码库中grep查找按钮上的文本。

  • 通常,人们会在提交消息中放入来自问题跟踪器的问题ID。如果您发现描述功能请求的问题,则可以搜索具有该问题ID的提交。


这是一个聪明的方法,但我认为它仅适用于公司环境。如果您只有压缩包怎么办?
py_script 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.