【问题标题】:How to break when entering own code?输入自己的代码时如何破解?
【发布时间】:2017-09-11 21:51:42
【问题描述】:

“仅我的代码”功能允许将调试操作限制为用户代码(具有可用 pdb 的未优化代码)。

程序流在 Visual Studio 中调用“我的代码”时是否可能中断?


潜在的应用程序:在复杂的第三方应用程序使用的库中调试问题时,问题发生时调用的任何东西都是一个很好的起点。输入自己的代码时中断将允许这样做而无需过多的日志记录。

【问题讨论】:

  • 您的意思是要在调试期间编辑您的代码?我们在VS中经常使用E&C,是你想用的吗?
  • @JackZhai-MSFT 不,我不需要编辑代码。问题是我不知道第三方程序调用了库的哪些部分(“我的代码”)。我想将调试器附加到第三方应用程序,并在调用库中的任何代码时中断。
  • 所以您没有第三方应用程序的源代码,对吗?一个想法是,您可以使用附加来处理并将第三方项目设置为“启动外部程序”,例如这种情况:stackoverflow.com/questions/13672751/…,因此您可以在类库中添加断点,如果它被命中,则意味着您的库已被第三方应用调用。
  • @JackZhai-MSFT 我知道如何让调试器运行。问题是我不知道使用了 >1k 潜在入口点中的哪一个,因此手动设置断点并不是一个真正的选择。此外,理想情况下,这些入口点在从库中调用时不应中断。我目前的解决方法是使用windbg(在定义断点时至少支持通配符)。如果您对如何改进问题有任何建议,请随时分享。
  • 很高兴知道你有一个很好的解决方法,如果你必须使用 VS,也许类断点就是你想要得到的:blogs.msdn.microsoft.com/habibh/2009/09/10/…

标签: visual-studio debugging breakpoints


【解决方案1】:

好像不是这样。

但是,如果所有自己的代码都在几个命名空间中,windbg 可以用作解决方法(以下是针对非托管代码;我假设托管代码也有一种方法):

> bm ModuleName!NamespaceName::*

将为给定命名空间内的任何入口点设置断点。如果所有访问都是单线程的,windbg 甚至可以打印执行中执行的所有实际条目的列表:

> bm ModuleName!NamespaceName::* "bd *; ln; l+t; p \"dv; pt \\\"be *; r $retreg; g\\\"\""

将向所有潜在的入口点添加断点,这些入口点会自动执行记录并再次退出:

  1. bd * 在输入“自己的代码”时禁用所有断点
  2. ln将信息打印到呼叫位置
  3. l+t; p "[...]"跳过调用约定处理
  4. dv 打印局部变量(包括现在处理的参数)
  5. pt "[...]"跳到方法结束
  6. be * 在我们离开“自己的代码”时重新启用断点
  7. r $retreg 记录方法结果(如果调用约定和结果类型导致使用结果寄存器)
  8. g继续下一个断点

从日志中至少可以识别出合理的断点和断点条件,以便进行第二次调试运行(在任何调试器中,包括 Visual Studio)。

【讨论】:

  • 感谢您在这里分享您的解决方案,您可以将其标记为答案。当然,如果我们发现其他更好的解决方法,我们会在这里分享。祝你有美好的一天:)
猜你喜欢
  • 2021-01-26
  • 1970-01-01
  • 2018-03-14
  • 1970-01-01
  • 2020-12-15
  • 2018-06-15
  • 2016-06-07
  • 1970-01-01
  • 2023-04-09
相关资源
最近更新 更多