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 sthrow()在构造函数和析构函数前面添加关键字这似乎表明反引号函数与异常处理有关
这些是 Microsoft 编译器为“粘合”函数生成的内部名称,可帮助将事物组合在一起,但并不直接对应于一行源代码。这是正常的。
在其他情况下,您会看到带有反引号的类似内部名称,例如使用 lambda 函数,或调用在另一个函数内部的结构体中声明的函数。
其他编译器有不同的方式来表示类似的无名代码块;标准在这里没有规定任何特定的行为,并且无论如何只能通过调试器观察到。
| 归档时间: |
|
| 查看次数: |
554 次 |
| 最近记录: |