在调试时创建调用堆栈的可视图(C#、Visual Basic、C++ 和 JavaScript)

创建代码映射,以便在调试时对调用堆栈进行可视化跟踪。 可以在映射中进行标注以跟踪代码执行的操作,以便专注于查找 Bug。

若要详细了解使用代码图时能使用的命令和操作,请参阅浏览和重新排列代码图

重要

只能在 Visual Studio Enterprise Edition 中创建代码图。

下面是代码图的简介:

Debugging with call stacks on code maps

生成调用堆栈图

  1. 在 Visual Studio Enterprise C#、Visual Basic 或者 JavaScript 项目中,若要开始调试,请选择“调试”>“开始调试”,或按 F5 。

  2. 在应用进入中断模式或你单步执行某一函数之后,请选择“调试”>“代码图”,或按 Ctrl+Shift+`

    当前的调用堆栈在新代码图上显示为橙色:

    See call stack on code map

随着你继续调试,代码图会自动更新。 更改映射项或布局不会对代码造成任何影响。 你可随意在图上重命名、移动或移除任何内容。

若要获取有关某个项的详细信息,请将鼠标悬停至该项,然后查看其工具提示。 也可以选择工具栏中的“图例”来了解每个图标的含义。

Code Map Legend

注意

代码图顶部如果出现消息“关系图可能基于旧版本的代码”,则说明在你上次更新图后,代码可能已发生更改。 例如,图中的某个调用可能已在代码中不存在了。 请关闭此消息,然后在再次更新图之前,尝试重新生成解决方案。

映射外部代码

默认情况下,只有你自己的代码会显示在图中。 若要查看图中的外部代码:

  • 右键单击“调用堆栈”窗口,然后选择“显示外部代码” :

    Display external code using the Call Stack window

  • 或在 Visual Studio“工具”(或“调试”)>“选项”>“调试”中取消选择“启用‘仅我的代码’”:

    Show external code using Options dialog

控制代码图的布局

更改代码图的布局不会对代码造成任何影响。

若要控制图的布局,请选择代码图工具栏上的“布局”菜单。

在“布局”菜单中,可以进行以下操作:

  • 更改默认布局。
  • 若要停止自动重新排列代码图,请取消选择“调试时自动布局”。
  • 若要在添加新项时尽可能少地重新排列代码图,请取消选择“增量布局”。

对代码进行标注

可以添加注释以跟踪代码中的情况。

若要添加注释,请在代码图中右键单击,选择“编辑”>“新建注释”,然后键入注释内容 。

若要在注释中添加新行,请按 Shift+Enter 。

Add comment to call stack on code map

使用下一个调用堆栈更新图

在运行应用到下一个断点或单步执行函数时,代码图会自动添加新的调用堆栈。

Update code map with next call stack

若要阻止代码图自动添加新的调用堆栈,请在代码图工具栏上选择 Show call stack on code map automatically。 代码图会继续突出显示现有的调用堆栈。 若要手动向图中添加当前的调用堆栈,请按 Ctrl+Shift+`

向图中添加相关代码

现在你已获得一个采用 C# 或 Visual Basic 格式的代码图,可以添加字段、属性和其他方法等项,以跟踪代码中的情况。

若要转到代码中某个方法的定义,请在代码图中双击该方法,或将其选中并按 F12,或右键单击该方法并选择“转到定义” 。

Go to code definition for a method on code map

若要将想跟踪的项添加到代码图中,请右键单击方法,然后选择想跟踪的项。最近添加的项显示为绿色。

Fields related to a method on call stack code map

注意

默认情况下,向图添加项还会添加父组节点(如类、命名空间和程序集)。 通过选择代码图工具栏上的“包括父项”按钮或在添加项时按 Ctrl,可以关闭和开启此功能 。

Show fields in a method on call stack code map

继续生成图以查看更多代码。

See methods that use a field: call stack code map

Methods that use a field on call stack code map

使用图查找 Bug

通过代码可视化,可帮助你更快发现 Bug。 例如,假设你正在调查某个绘图应用中的 Bug。 当你绘制一条线并尝试撤消该操作时,直到你绘制另一条线后才会发生变化。

因此,可在 clearundoRepaint 方法中设置断点,启动调试,然后生成如下所示的图:

Add another call stack to code map

你注意到图中所有用户笔势均调用 Repaint,但 undo 除外。 这可能解释了 undo 不立即发挥作用的原因。

在修复此 Bug 并继续运行应用后,图中增加了从 undoRepaint 的新调用:

Add new method call to call stack on code map

与他人共享此代码图

你可以导出代码图,然后通过 Microsoft Outlook 将其发送给其他人,或保存到你的解决方案中,再将其签入版本控制。

若要共享或保存代码图,请使用代码图工具栏中的“共享”。

Share call stack code map with others