有没有办法自动避免步入Visual Studio中的某些功能?

Fer*_*cio 28 c++ debugging visual-studio

我知道"只启用我的代码"调试选项,但这只适用于托管代码.

我正在寻找一种方法来进入函数调用,而不必单步执行,例如,STL字符串强制转换操作符,因为在函数的一个参数中存在从char*到字符串的隐式转换.

Fer*_*cio 19

我发现这个博客条目有一个解决方案.虽然我更愿意说"不要介入任何不属于这个项目的东西",但这看起来还是可行的.

编辑:看了几个博客和新闻组后,方法是为每个你不想在这个注册表项下进入的函数添加一个条目(假设VS 2005):

32 bit Windows
    \\HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\8.0\NativeDE\StepOver
64 bit Windows
    \\HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\VisualStudio\8.0\NativeDE\StepOver

路径的版本号:

Visual Studio 2005: 8.0
Visual Studio 2008: 9.0
Visual Studio 2010: 10.0
Visual Studio 2012: 11.0
Visual Studio 2013: 12.0

此键包含一组影响步进执行的规则.每个规则都被指定为一个单独的条目,其名称是十进制数,其值是一个函数名称模式,用于指定我们想要影响的函数.例如

    "10" = "boost\:\:scoped_ptr.*\:\:.*=NoStepInto"

阻止步入boost :: scoped_ptr函数.

从高值到低值评估规则,直到找到匹配的模式,或者没有剩下的规则.在这种情况下,该功能进入.

函数名称是正则表达式.

冒号需要用反斜杠引用.

您可以指定StepInto以及NoStepInto.这为您提供了一种避免步入同一范围/命名空间中的所有功能的方法.

重新启动Visual Studio以获取对注册表的更改.

  • 虽然上面的详细信息中列出了Visual Studio 2012,2013,但不再使用该注册表.有关如何更新default.natstepfilter的详细信息,请访问博客条目链接. (3认同)

Mar*_*ram 5

https://docs.microsoft.com/en-us/visualstudio/debugger/just-my-code?view=vs-2019#BKMK_CPP_Customize_stepping_behavior

在 C++ 项目中,您可以通过将函数列为 *.natstepfilter 文件中的非用户代码来指定要跳过的函数。*.natstepfilter 文件中列出的函数不依赖于 Just My Code 设置。

  • 若要为所有本地 Visual Studio 用户指定非用户代码,请将 .natstepfilter 文件添加到文件%VsInstallDirectory%\Common7\Packages\Debugger\Visualizers夹中。
  • 要为单个用户指定非用户代码,请将 .natstepfilter 文件添加到文件%USERPROFILE%\My Documents\<Visual Studio version>\Visualizers夹中。

.natstepfilter 文件是具有以下语法的 XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<StepFilter xmlns="http://schemas.microsoft.com/vstudio/debugger/natstepfilter/2010">
    <Function>
        <Name>FunctionSpec</Name>
        <Action>StepAction</Action>
    </Function>
    <Function>
        <Name>FunctionSpec</Name>
        <Module>ModuleSpec</Module>
        <Action>StepAction</Action>
    </Function>
</StepFilter>
Run Code Online (Sandbox Code Playgroud)
元素 描述
功能 必需的。将一个或多个函数指定为非用户函数。
姓名 必需的。指定要匹配的完整函数名称的 ECMA-262 格式的正则表达式。例如:

<Name>MyNS::MyClass.*</Name>

告诉调试器 MyNS::MyClass 中的所有方法都将被视为非用户代码。匹配区分大小写。
模块 可选的。一个 ECMA-262 格式的正则表达式,指定包含函数的模块的完整路径。匹配不区分大小写。
行动 必需的。这些区分大小写的值之一:

NoStepInto- 告诉调试器单步执行该函数。
StepInto- 告诉调试器单步执行函数,覆盖匹配函数的任何其他 NoStepInto。