如何在Visual Studio 2008中通过逐步调试C#代码找到方法的调用者?

30

如果我在Visual Studio 2008中在一个方法上设置了断点,当断点被触发时,如何查看调用该方法的代码?


右键点击并“转到定义”?这是您的意思吗? - rball
2
啊,我的新手时代。 - Ronnie Overby
6个回答

61

检查调用堆栈窗口(从菜单:调试 > 窗口 > 调用堆栈)。双击每个条目将带您到调用语句。您还可以右键单击它以启用/禁用显示外部代码项和来自其他线程的调用。


1
这是通常的做法。除非该方法是内联的(如果它是调试构建,则很奇怪),否则在您的特定情况下可能会有一些问题。 - Mehrdad Afshari
内联是一种优化技术,它将方法调用替换为被调用方法的主体。 - Mehrdad Afshari
我不确定在.NET中是否使用了内联。 - Roman Plášil
JIT优化器在.NET中进行内联。它不会在调试构建或在使用调试器运行时执行此操作(如果您在启动启用了优化的发布构建后附加调试器,则会执行此操作)。 - Mehrdad Afshari
它刚开始工作了。我不认为我改变了什么。现在我的调用堆栈窗口中有3个新的东西,显示了执行路径。谢谢。 - Ronnie Overby

4
当断点被触发时,您可以查看整个调用堆栈。您可以通过Debug菜单->Windows->Call Stack打开该窗口。
您也可以使用快捷键Alt+Ctrl+C打开它。
编辑: 您还可以右键单击函数名称,并查看“调用者图”,其中将显示该方法的所有调用者。或者,您可以打开Call Browser(通过View->Other windows->Call Browser),并搜索您方法的名称。

  • 代表快捷键 ctrl + alt + C 和调用者图。
- FrenkyB
追踪所有调用方法的流程是个好主意。 - Hassan Saeed

4
如果在用户设置的断点处看不到任何内容,通常意味着它是从本地代码调用的。另一种无法获取堆栈的情况是:您点击了"调试>中断所有",并且主线程处于等待/休眠状态时,调试器可能在构建调用堆栈时出现问题。我相信调试器使用主线程进行其隐式函数评估。请尝试附加(或启动)混合模式(本机和托管)代码调试器,并查看是否可以解决问题。

1
如果您在调用堆栈窗口中看不到任何内容,那么肯定出了问题。我建议采取著名的R操作序列:
  • 重试
  • 重新编译
  • 重启
  • 重新安装 :)

1
如果断点位于由事件触发的函数中,则可能没有直接返回调用者的调用堆栈,您需要启用查看所有代码而不仅仅是“我的代码”。

0
在 Visual Studio 2019 中,打开“视图”菜单并选择“调用层次结构”,或者直接按下“CTRL+ALT+K”即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接