summaryrefslogtreecommitdiff
path: root/binaryninjaapi.h
diff options
context:
space:
mode:
authorRusty Wagner <rusty@vector35.com>2019-04-27 20:41:56 -0400
committerRusty Wagner <rusty@vector35.com>2019-04-27 20:41:56 -0400
commit7887727f48ab8078a1ac855bb4b0766af7e2d619 (patch)
tree7435ecf86fd9d7f28b42fa8c7ad24ce2d0adcdc2 /binaryninjaapi.h
parent453eb5bdc70513464c7137f910cba815289c97a0 (diff)
Add debug mode for finding refcount leaks
Diffstat (limited to 'binaryninjaapi.h')
-rw-r--r--binaryninjaapi.h32
1 files changed, 32 insertions, 0 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h
index 1b0232fc..b6d71165 100644
--- a/binaryninjaapi.h
+++ b/binaryninjaapi.h
@@ -43,6 +43,8 @@
#define NOEXCEPT noexcept
#endif
+//#define BN_REF_COUNT_DEBUG // Mac OS X only, prints stack trace of leaked references
+
namespace BinaryNinja
{
@@ -199,6 +201,9 @@ namespace BinaryNinja
class Ref
{
T* m_obj;
+#ifdef BN_REF_COUNT_DEBUG
+ void* m_assignmentTrace = nullptr;
+#endif
public:
Ref<T>(): m_obj(NULL)
@@ -208,23 +213,44 @@ namespace BinaryNinja
Ref<T>(T* obj): m_obj(obj)
{
if (m_obj)
+ {
m_obj->AddRef();
+#ifdef BN_REF_COUNT_DEBUG
+ m_assignmentTrace = BNRegisterObjectRefDebugTrace(typeid(T).name());
+#endif
+ }
}
Ref<T>(const Ref<T>& obj): m_obj(obj.m_obj)
{
if (m_obj)
+ {
m_obj->AddRef();
+#ifdef BN_REF_COUNT_DEBUG
+ m_assignmentTrace = BNRegisterObjectRefDebugTrace(typeid(T).name());
+#endif
+ }
}
~Ref<T>()
{
if (m_obj)
+ {
m_obj->Release();
+#ifdef BN_REF_COUNT_DEBUG
+ BNUnregisterObjectRefDebugTrace(typeid(T).name(), m_assignmentTrace);
+#endif
+ }
}
Ref<T>& operator=(const Ref<T>& obj)
{
+#ifdef BN_REF_COUNT_DEBUG
+ if (m_obj)
+ BNUnregisterObjectRefDebugTrace(typeid(T).name(), m_assignmentTrace);
+ if (obj.m_obj)
+ m_assignmentTrace = BNRegisterObjectRefDebugTrace(typeid(T).name());
+#endif
T* oldObj = m_obj;
m_obj = obj.m_obj;
if (m_obj)
@@ -236,6 +262,12 @@ namespace BinaryNinja
Ref<T>& operator=(T* obj)
{
+#ifdef BN_REF_COUNT_DEBUG
+ if (m_obj)
+ BNUnregisterObjectRefDebugTrace(typeid(T).name(), m_assignmentTrace);
+ if (obj)
+ m_assignmentTrace = BNRegisterObjectRefDebugTrace(typeid(T).name());
+#endif
T* oldObj = m_obj;
m_obj = obj;
if (m_obj)