Microsoft Visual C++ 中的共享指针调试

Posted

技术标签:

【中文标题】Microsoft Visual C++ 中的共享指针调试【英文标题】:Shared pointers debugging in Microsoft Visual C++ 【发布时间】:2016-06-06 09:34:15 【问题描述】:

在 Microsoft Visual C++ 中有没有一种方法可以查看代码中引用共享指针的点?

例如:

class MyClass;
class MyDerClass : public MyClass;
boost::shared_ptr<MyClass> pmc1 = new MyClass;
boost::shared_ptr<MyClass> pmc2 = pmc1;
boost::shared_ptr<MyDerClass> pmc3 = pmc1;
...
delete pmc1;   // object still around until pmc2 and pmc3 are deleted

我能否知道哪些指针(在源代码级别)仍指向该对象?

【问题讨论】:

你想找到对 1 个实例的每个引用(这样你可能会得到一些关于 2 个共享对象的共享指针的引用),还是只找到 1 个共享指针? @Rakete1111 - 我想找到对 1 个实例的每个引用。 右键 > 查找所有参考文献。 【参考方案1】:

我认为这是不可能的。您可以检查一个shared_ptr 的引用计数,以查看有多少对底层对象的引用未完成,但这并不是您所追求的。

为了知道shared_ptr&lt;T&gt; 的哪些未完成实例指向同一个T*,您需要扩充或重新实现shared_ptr&lt;&gt; 以跟踪(可能仅在调试版本中)所有shared_ptr&lt;&gt; 实例静态全局线程安全映射。这并不能完全满足您的要求,但是如果您还向每个 shared_ptr&lt;&gt; 构造函数添加一个字符串(“标签”)参数(可能使用 __FUNCTION__ 和一些用于上下文标签的宏化),您至少可以转储特定时间点的地图并查看指向什么。

您可能并不想在调试器中检查所有这些,但也许在某些情况下您需要断言和问题的详细报告?就像“当我到达这里时,我应该持有对该对象的最后一个引用,如果这不是真的,我想提出一个断言并报告还有什么持有一个”?如果是这种情况,您可以通过在添加和删除引用时启用一些详细的逐个对象日志记录来实现目标。

我们在互斥锁方面遇到了类似的问题,即我们想知道是否存在由代码路径导致的潜在死锁情况,这些代码路径可能会以不同的顺序锁定和持有两个或多个互斥锁。我们最终构建了一个“安全互斥体”,它跟踪全局数据结构中的所有互斥锁顺序元组,以及检测不兼容排序的逻辑。这对生产来说太慢了,但在调试版本中运行良好。它还可以告诉我们给定线程是否锁定了互斥锁,以标记诸如在 RPC 调用期间持有互斥锁等问题,这在某些情况下是个坏主意。

【讨论】:

以上是关于Microsoft Visual C++ 中的共享指针调试的主要内容,如果未能解决你的问题,请参考以下文章

Microsoft Visual C++ 中的 SFINAE constexpr 错误

在 Microsoft Visual Studio 中的 x86 C++ 应用程序中集成犰狳

Microsoft Visual C++ 6.0中的绘图库文件是啥

Microsoft Visual C++ Runtime Libuary

电脑提示“microsoft visual c++ runtime library ”,怎么修复

如何在 C++ 中使用 Microsoft Visual Studio 2012 查找语法错误?