diff options
| author | Rusty Wagner <rusty@vector35.com> | 2019-04-27 20:41:56 -0400 |
|---|---|---|
| committer | Rusty Wagner <rusty@vector35.com> | 2019-04-27 20:41:56 -0400 |
| commit | 7887727f48ab8078a1ac855bb4b0766af7e2d619 (patch) | |
| tree | 7435ecf86fd9d7f28b42fa8c7ad24ce2d0adcdc2 /binaryninjaapi.h | |
| parent | 453eb5bdc70513464c7137f910cba815289c97a0 (diff) | |
Add debug mode for finding refcount leaks
Diffstat (limited to 'binaryninjaapi.h')
| -rw-r--r-- | binaryninjaapi.h | 32 |
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) |
