vs用户模式调试器中的反引号符号是什么

tcb*_*tcb 5 c++ debugging visual-studio

Program.exe使用vs12 编译了以下c ++代码

class foo
{
public:
    foo()
    {
        std::cout << "in ctor\n";
    }

    ~foo()
    {
        std::cout << "in dtor\n";
    }

    std::string s;
};

int main()
{
    foo f{};
}
Run Code Online (Sandbox Code Playgroud)

然后我转到" 工具 - >在调试器下启动... "并在调试器立即窗口中键入以下命令

x program!*foo*
Run Code Online (Sandbox Code Playgroud)

这给了我以下输出

0:000> x program!*foo*
00007ff6`11ce4b00 Program!foo::~foo (void)
00007ff6`11ceaef0 Program!`foo::~foo'::`1'::dtor$0 (void)
00007ff6`11ce48f0 Program!foo::foo (void)
00007ff6`11ceae90 Program!`foo::foo'::`1'::dtor$0 (void)
Run Code Online (Sandbox Code Playgroud)

我理解第一个输出是foo析构函数,第三个是foo构造函数.第二个和第四个(带有反引号的那些)是什么?更一般地说,在用户模式调试器中我可能会看到反引号的其他地方是什么?

有趣的是,如果完成以下任何操作,则反引号功能会消失

  • 删除std::cout陈述
  • 去掉 std::string s
  • throw()在构造函数和析构函数前面添加关键字

这似乎表明反引号函数与异常处理有关

Sti*_*sis 3

这些是 Microsoft 编译器为“粘合”函数生成的内部名称,可帮助将事物组合在一起,但并不直接对应于一行源代码。这是正常的。

在其他情况下,您会看到带有反引号的类似内部名称,例如使用 lambda 函数,或调用在另一个函数内部的结构体中声明的函数。

其他编译器有不同的方式来表示类似的无名代码块;标准在这里没有规定任何特定的行为,并且无论如何只能通过调试器观察到。