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

Shared pointers debugging in Microsoft Visual C++

本文关键字:共享 指针 调试 Visual C++ Microsoft      更新时间:2023-10-16

在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

我能知道哪些指针(在源代码级别)仍然指向那个对象吗?

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

为了知道shared_ptr<T>的哪些未完成实例指向相同的T*,您需要增强或重新实现shared_ptr<>,以跟踪(可能仅在调试构建中)静态全局线程安全映射中的所有shared_ptr<>实例。这并不能完全得到你想要的,但如果你也向每个shared_ptr<>构造函数添加一个字符串(一个"标签")参数(也许使用__FUNCTION__和一些用于上下文标记的宏化),你至少可以在某个时间点转储映射,并查看指向什么。

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

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