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

标签 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{};
}

然后我转到“Tools->Launch Under Debugger...”并在调试器即时窗口中键入以下命令

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()关键字

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

最佳答案

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

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

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

关于c++ - vs 用户模式调试器中的反引号是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26264712/

相关文章:

c++ - Windows I/O 驱动程序中的主动等待

asp.net - 下拉列表事件不显示在属性窗口 asp.net Visual Studio 2010

c# - 无法在表单中找到 {Microsoft.VisualBasic.PowerPacks.RectangleShape} 控件

debugging - Haskell 调试任意 lambda 表达式

Python多进程调试

swift - 你能装饰一个破坏调试的函数,而不是在调用该函数的地方中断吗?

c++ - 在类中初始化静态 union

c++ - 如何使用 Boost 获取 POSIX 时区?

c++ - 我是否需要在析构函数中使成员变量无效?

windows - 升级后"application has failed to start ... configuration is incorrect"?