在 Visual Studio 中检查内存转储时匿名命名空间中的符号
Posted
技术标签:
【中文标题】在 Visual Studio 中检查内存转储时匿名命名空间中的符号【英文标题】:Symbol in anonymous namespace when inspecting memory dump in Visual Studio 【发布时间】:2021-09-13 16:31:48 【问题描述】:背景
我有一个用 C++ 编写的服务器的错误报告。错误报告包含对意外行为和内存转储的描述。现在我尝试从内存转储中获取信息。我正在尝试检查该内存转储的内存内容。
问题
我能够找到指向希望检查以分析问题的对象的指针。它是指向某个接口的指针。现在我知道这个指针指向在匿名命名空间中定义的某些特定类型的对象。遗憾的是 VS 没有推断出该磁带(基于运行时信息)。 VS 向我展示的唯一指向接口的指针是虚拟表的内容。因此,要检查此对象的内容,我必须指示 Visual Studio 将此指针向下转换为该类型。问题是我应该输入什么来满足 Visual Studio。
注意,因为这是内存转储断点或继续执行不是一种选择。我无法在我的开发环境中重现问题,所以这个转储是我找到问题的最佳机会。
添加到手表这个:
(InterfaceImplementation*)(some_pointer->pointer_to_interafece)
由于 VS 说:
标识符“InterfaceImplementation”未定义
可能的解决方案
AFAIK 匿名命名空间实际上会生成一个具有随机名称的命名空间。所以为了解决我的问题,我应该找到一种方法来提供这个生成的随机名称,这样我就可以使用完整的符号名称。
问题
有没有办法检查匿名命名空间中的符号? 我可以在匿名命名空间中找到我的符号以识别该命名空间吗?
【问题讨论】:
我有一个模糊的回忆,需要让调试器在具有本地命名空间的源文件中的某个函数处停止,以便在该命名空间中定义的符号对其可见。我只是看some_pointer
并扩大它以查看成员还不够吗?
这是生产中的内存转储。它停在原地,纯属偶然。正如我写的那样,我有一个指向接口的指针,VS 没有推断出实际类型,所以我必须强制转换才能看到该对象的内容。
【参考方案1】:
好吧,我突然顿悟了。
找到线索
此指针的 VS 向我显示了虚拟表的内容。令人高兴的是,那里列出的功能是以人类可读的形式描述的。例如:
[0] 0x00007ff75595b0a0 MyApp.exe!InterfaceImplementation<`anonymous namespace'::SystemApi>::`scalar deleting destructor'(unsigned int) void *
解决方案
所以是的,我忘了提到 InterfaceImplementation
实际上是一个模板,它的实例代表生产或可测试版本(这取决于 SystemApi
)。
所以我只是将这部分 InterfaceImplementation<'anonymous namespace'::SystemApi>
复制粘贴到铸件中,现在我看到了我需要看到的所有内容。
【讨论】:
以上是关于在 Visual Studio 中检查内存转储时匿名命名空间中的符号的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Visual Studio 中调试/分析 BSOD 转储?
在 Visual Studio C++ 中,内存分配表示形式是啥?