在 Visual Studio 中检查内存转储时匿名命名空间中的符号

问题描述

背景

我有一份用 C++ 编写的服务器的错误报告。错误报告包含对意外行为和内存转储的描述。现在我尝试从内存转储中获取信息。我正在尝试检查该内存转储的内存内容

问题

我能够找到指向我希望检查以分析问题的对象的指针。它是指向某个接口的指针。现在我知道这个指针指向匿名命名空间中定义的某种特定类型的对象。遗憾的是,VS 没有推断出该磁带(基于运行时信息)。对于这个指向接口的指针,VS 向我展示的唯一一件事是虚拟表的内容。因此,要检查此对象的内容,我必须指示 Visual Studio 将此指针转换为该类型。问题是我应该输入什么来满足 Visual Studio

请注意,因为这是内存转储断点或继续执行不是一种选择。我无法在我的开发环境中重现问题,因此此转储是我找到问题的最佳机会。

添加到观看此内容

(InterfaceImplementation*)(some_pointer->pointer_to_interafece)

不起作用,因为 VS 说:

标识符“InterfaceImplementation”未定义

可能的解决方

AFAIK 匿名命名空间实际上生成一个带有随机名称的命名空间。所以为了解决我的问题,我应该找到一种方法来提供这个生成随机名称,以便我可以使用完整的符号名称

问题

有没有办法检查匿名命名空间中的符号? 我可以在匿名命名空间中找到我的符号以识别该命名空间吗?

解决方法

好吧,我突然顿悟了。

找到线索

这个指针的VS向我展示了虚拟表的内容。令人高兴的是,那里列出的功能以人类可读的形式进行了描述。例如:

        [0] 0x00007ff75595b0a0 {MyApp.exe!InterfaceImplementation<`anonymous namespace'::SystemApi>::`scalar deleting destructor'(unsigned int)}    void *

解决方案

是的,我忘了提到 InterfaceImplementation 实际上是一个模板,它的实例代表生产版本或可测试版本(它依赖于 SystemApi)。

所以我只是将这部分 InterfaceImplementation<'anonymous namespace'::SystemApi> 复制粘贴到演员表中,现在我看到了我需要看到的一切。