使用代码映射调试应用程序

Visual Studio 中的代码映射 有助于避免在大型代码库、不熟悉的代码或旧代码中丢失。 例如,在调试时,可能需要跨多个文件和项目查看代码。 使用代码映射在代码片段周围导航并了解它们之间的关系。 这样,就不必在脑海中记住此代码,也不必绘制单独的图示。 因此,当工作中断时,代码映射有助于刷新有关你正在处理的代码的内存。

代码图 - 映射代码中的关系

绿色箭头显示光标在编辑器中的显示位置

有关处理代码映射时可以使用的命令和操作的详细信息,请参阅“浏览和重新排列代码映射”

详细了解如何使用 调试器工具在 Visual Studio 中进行调试

注释

若要创建和编辑代码映射,需要 Visual Studio Enterprise 版本。 在 Visual Studio Community 和 Professional 版本中,可以打开在 Enterprise Edition 中生成的关系图,但不能对其进行编辑。

了解问题

假设你正在处理的绘图程序中存在一个 bug。 若要重现 bug,请在 Visual Studio 中打开解决方案,然后按 F5 开始调试。

绘制线条后选择“撤消我最后一个笔划”,在绘制下一笔线条之前,不会发生任何变化。

代码映射 - 重现错误

因此,您开始通过搜索Undo方法来进行调查。 你可以在PaintCanvas类中找到它。

代码图 - 查找代码

开始映射代码

现在开始映射 undo 方法及其关系。 在代码编辑器中,您将 undo 方法及其所引用的字段添加到新的代码映射中。 创建新地图时,可能需要一些时间来索引代码。 这有助于以后操作运行速度更快。

代码图 - 显示方法和相关字段

小窍门

绿色高亮显示地图上新添加的最后几项。 绿色箭头显示光标在代码中的位置。 项之间的箭头表示不同的关系。 可以通过将鼠标移到地图上的项目并检查其工具提示来获取有关地图上项的详细信息。

代码图 - 显示工具提示

若要查看每个字段的代码定义,请双击地图上的字段或选择该字段,然后按 F12。 绿色箭头在地图上的项之间移动。 代码编辑器中的光标也会自动移动。

代码映射窗口的屏幕截图,其中选择了历史记录字段,并突出显示了所有历史记录实例的代码编辑器窗口。

代码映射窗口的屏幕截图,其中选择了 paintObjects 字段,并突出显示了 paintObject 的所有实例的代码编辑器窗口。

小窍门

还可以通过在代码编辑器中移动光标,在地图上移动绿色箭头。

了解代码片段之间的关系

现在,你想知道哪些其他代码与historypaintObjects字段交互。 可以将引用这些字段的所有方法添加到地图。 可以从地图或代码编辑器执行此作。

代码图 - 查找所有引用

从代码编辑器打开代码映射

注释

如果从跨多个应用(如 Windows Phone 或 Windows 应用商店)共享的项目添加项,则这些项始终与地图上当前处于活动状态的应用项目一起显示。 如果将上下文更改为另一个应用项目,那么当共享项目中新增加项时,地图上的上下文也会相应更改。 对地图上的元素执行的操作仅适用于处于同一上下文的元素。

更改布局以重新排列关系流,并使地图更易于阅读。 还可以通过拖动在地图上移动物品。

代码图窗口的屏幕截图,其中“布局”菜单处于打开状态,并选择了“从左到 Rgiht”命令。

小窍门

默认情况下, 增量布局 处于打开状态。 这会在添加新项时尽可能少地重新排列地图。 若要每次添加新项时重新排列整个地图,请关闭 增量布局

代码映射窗口的屏幕截图,显示字段之间的关系箭头从左指向右。

让我们来看看这些方法。 在地图上,双击 PaintCanvas 方法,或选择此方法并按 F12。 你了解到该方法会将 historypaintObjects 创建为空列表。

代码图窗口的屏幕截图,其中选择了 PaintCanvas 方法,并显示突出显示了 PainCanvas 方法名称的代码片段图像。

现在重复相同的步骤来检查 clear 方法定义。 你得知clearpaintObjectshistory一起执行一些任务。 然后,它会调用该方法 Repaint

选择了 Clear 方法的代码映射窗口的屏幕截图,以及显示 Clear 方法代码的代码片段图像。

现在检查 addPaintObject 方法定义。 它还与 historypaintObjects 一起执行一些任务。 它还调用 Repaint

代码映射窗口的屏幕截图,其中选择了 addPaintObject 方法,并显示了 addPaintObject 方法的代码片段图像。

通过检查地图查找问题

似乎所有修改 historypaintObjects 的方法都会调用 Repaint。 然而,即便undo修改了相同的字段,undo方法也不会调用Repaint。 因此,你认为可以通过从Repaint中调用undo来解决此问题。

代码图 - 查找缺少的方法调用

如果没有图示来展示这个遗漏的调用,可能会更难发现这个问题,特别是在处理更复杂的代码时。

共享发现和后续步骤

在修复此 bug 之前,可以在地图上记下问题及其解决方法。

代码映射 - 为后续操作注释和标记项目

例如,可以使用颜色向地图和标记项添加注释。

代码图 - 注释和标记的项

如果已安装 outlook Microsoft,则可以将地图通过电子邮件发送给其他人。 还可以将地图导出为图像或其他格式。

代码图 - 共享、导出、邮件

修复问题并展示解决过程

若要修复此 bug,请将调用添加到 undoRepaint

代码图 - 添加缺少的方法调用

重新确认您的修复是否有效,请重启调试会话并尝试重现错误。 当你点击“撤消我最后一次操作”时,它按预期效果运行,并确认你进行了正确的修复。

代码映射 - 确认代码修正

可以更新地图以显示所做的修复。

代码图 - 用缺失的方法调用更新代码图

地图现在显示 撤消重新绘制之间的链接。

代码图 - 通过方法调用更新的地图

注释

更新地图时,可能会看到一条消息,指出用于创建地图的代码索引已更新。 这意味着有人更改了代码,这会导致您的映射与当前代码不匹配。 这不会阻止更新映射,但可能需要重新创建映射以确认它是否与代码匹配。

现在,你已完成调查。 通过映射代码成功找到并修复了问题。 你还有一个地图,可帮助你在代码中导航、记住所学内容,并显示解决问题所采取的步骤。