visual studio 2017 我必须做什么才能使用 natstepfilter 文件来避免进入标准库函数和 class 方法?

What must I do for visual studio 2017 to use the natstepfilter file to avoid stepping into std library functions and class methods?

首先,我通过特意编辑 default.natstepfilter 文件来测试此功能。我意识到现在 visual studio 中内置了一个 just my code 功能和一个相关的编译器设置 /JMC。但是我有一个仍然使用旧的 VS2013 工具构建的遗留项目,所以我不能只使用更新的代码功能来避免进入 STL 和其他库函数。因此,我设置了一个简单的 hello world 示例来弄清楚如何使用接下来两篇文章中描述的技术。

看了这两篇文章,过滤器略有不同。我已经尝试了两种方式,有和没有转义冒号字符,但似乎都不起作用。 https://blog.wholetomato.com/2020/08/18/prevent-debugger-from-stepping-into-unwanted-functions-in-visual-studio/ https://www.asawicki.info/news_1486_how_to_make_visual_studio_debugger_not_step_into_stl.html

考虑这段代码。当进入采用 c 字符串的 printGreeting 时,我不想进入 std::string 的 c_str() 方法,但我必须单击 f-11 才能进入 printGreeting,所以这是我的测试用例用于验证对 default.natstepfilter 的更改是否有效。

我已经尝试了上述网站推荐的这两条线,但似乎都没有效果。我认为不需要冒号转义,但一个例子就是这样显示的。

<Function><Name>std::.+ </Name><Action>NoStepInto</Action>
<Function><Name>std\:\:.* </Name><Action>NoStepInto</Action>

这里是示例代码。

#include "pch.h"
#include <iostream>
using namespace std;

void printGreeting(const char* greeting) {
    std::cout << greeting << std::endl; 
}

int main()
{
   std::string greeting("Hello World!\n");
   printGreeting(greeting.c_str());
}

我也试过在编辑 .natstepfilter 后重新启动 visual studio 2017,但没有效果。调试器仍然进入 std::string 和 c_str() 方法的构造函数。

我想我通过重新开始并创建一个扩展名为 .natstepfilter 的新文件解决了我自己的问题。我无法证明文件中的错误是问题所在,因为我尝试过的先前文件已被更改或删除。但是,我相当确信我编辑的 .natstepfilter 文件中存在错误。通过故意插入错误,我能够再次重现该问题。在我原来的 post 中,我的 xml 示例条目是错误的。它缺少尾随标记。当我从浏览器 window 复制和粘贴示例时,我可能没有复制整行或者复制了一些额外的内容。也有可能是我没有将编辑后的文件正确复制并粘贴到原始问题中。 当文件包含错误时,将静默加载失败。我在任何地方都找不到显示加载该文件时出现问题的诊断输出。

我还从 Microsoft 文档中获悉,您可以使用您喜欢的任何名称创建一个新的 .natstepfilter 文件,而不是修改默认文件,因此更喜欢这种方法,以避免在原始文件中引入错误。这是我创建的对我有用的文件的内容。

<?xml version="1.0" encoding="utf-8"?>
<StepFilter xmlns="http://schemas.microsoft.com/vstudio/debugger/natstepfilter/2010">
  <Function><Name>std::.*</Name><Action>NoStepInto</Action></Function>
</StepFilter>

此外,您可以将这些文件放在您的 %USERPROFILE%\Documents\Visual Studio 2017\Visualizers 目录中,这样您就不必将文件添加到系统安装目录中。我确实必须手动创建 Visualizers 目录,然后创建文件。如果您想在多个文件中组织条目,您可以使用扩展名添加多个文件。