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

时间:2014-10-08 19:16:42

标签: c++ visual-studio debugging

我使用vs12

将以下c ++代码编译到Program.exe
class foo
{
public:
    foo()
    {
        std::cout << "in ctor\n";
    }

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

    std::string s;
};

int main()
{
    foo f{};
}

然后我去&#34; Tools->Launch Under Debugger...&#34;并在调试器立即窗口中键入以下命令

x program!*foo*

这给了我以下输出

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)

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

有趣的是,如果完成以下任何操作,反引号函数就会消失

  • 删除std::cout语句
  • 删除std::string s
  • 在构造函数和析构函数
  • 前添加throw()关键字

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

1 个答案:

答案 0 :(得分:2)

这些是Microsoft编译器为&#34; glue&#34;生成的内部名称。有助于事物融合的功能,但不能直接对应一行源代码。这是正常的。

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

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