21 #include "libpbd-config.h"
32 #include <glibmm/threads.h>
33 #include <boost/shared_ptr.hpp>
41 std::ostream&
print (std::ostream& str)
const;
66 strings = ::backtrace_symbols (
trace,
size);
69 for (i = 3; i < 5+18 && i <
size; i++) {
70 str << strings[i] << std::endl;
90 str <<
"*********************************************\n";
91 if (btp.
ref) str << *btp.
ref << std::endl;
93 if (btp.
rel) str << *btp.
rel << std::endl;
110 str <<
"Constructor :" << std::endl;
172 pair<void*,const char*> newpair (ptr, type);
175 cerr <<
"Interesting object @ " << ptr <<
" of type " << type << endl;
182 if (old_obj == 0 && obj == 0) {
190 cerr <<
"ASSIGN SWAPS " << old_obj <<
" & " << obj << endl;
196 cerr <<
"\tlost old sp @ " << sp <<
" for " << old_obj <<
" UC = " << old_use_count <<
" now for " << obj <<
" UC = " << new_use_count
197 <<
" (total sp's = " <<
sptrs().size() <<
')' << endl;
199 PointerMap::iterator x =
sptrs().find (sp);
201 if (x !=
sptrs().end()) {
204 cerr <<
"\tRemoved (by assignment) sp for " << old_obj <<
" @ " << sp <<
" UC = " << old_use_count <<
" (total sp's = " <<
sptrs().size() <<
')' << endl;
211 pair<void const*, SPDebug*> newpair;
216 sptrs().insert (newpair);
219 cerr <<
"assignment created sp for " << obj <<
" @ " << sp <<
" used to point to " << old_obj <<
" UC = " << old_use_count
220 <<
" UC = " << new_use_count
221 <<
" (total sp's = " <<
sptrs().size() <<
')' << endl;
222 cerr << *newpair.second << endl;
230 if (old_obj == 0 && obj == 0) {
238 cerr <<
"RESET SWAPS " << old_obj <<
" & " << obj << endl;
244 cerr <<
"\tlost old sp @ " << sp <<
" for " << old_obj <<
" UC = " << old_use_count <<
" now for " << obj <<
" UC = " << new_use_count
245 <<
" (total sp's = " <<
sptrs().size() <<
')' << endl;
247 PointerMap::iterator x =
sptrs().find (sp);
249 if (x !=
sptrs().end()) {
252 cerr <<
"\tRemoved (by reset) sp for " << old_obj <<
" @ " << sp <<
" UC = " << old_use_count <<
" (total sp's = " <<
sptrs().size() <<
')' << endl;
259 pair<void const*, SPDebug*> newpair;
264 sptrs().insert (newpair);
267 cerr <<
"reset created sp for " << obj <<
" @ " << sp <<
" used to point to " << old_obj <<
" UC = " << old_use_count
268 <<
" UC = " << new_use_count
269 <<
" (total sp's = " <<
sptrs().size() <<
')' << endl;
270 cerr << *newpair.second << endl;
279 PointerMap::iterator x =
sptrs().find (sp);
281 if (x !=
sptrs().end()) {
284 cerr <<
"Removed sp for " << obj <<
" @ " << sp <<
" UC = " << use_count <<
" (total sp's = " <<
sptrs().size() <<
')' << endl;
294 pair<void const*, SPDebug*> newpair;
299 sptrs().insert (newpair);
301 cerr <<
"Stored constructor for " << obj <<
" @ " << sp <<
" UC = " << use_count <<
" (total sp's = " <<
sptrs().size() <<
')' << endl;
302 cerr << *newpair.second << endl;
319 if (
sptrs().empty()) {
320 cerr <<
"There are no dangling shared ptrs\n";
322 for (PointerMap::iterator x =
sptrs().begin(); x !=
sptrs().end(); ++x) {
323 cerr <<
"Shared ptr @ " << x->first <<
" history: "
static Glib::Threads::Mutex & the_lock()
void boost_debug_shared_ptr_operator_equals(void const *sp, void const *old_obj, int old_use_count, void const *obj, int new_use_count)
void sp_scalar_destructor_hook(void *)
static IPointerMap * _interesting_pointers
void sp_counter_ref_hook(void *, long)
void sp_array_destructor_hook(void *)
std::ostream & print(std::ostream &str) const
static Glib::Threads::Mutex * _the_lock
void boost_debug_shared_ptr_constructor(void const *sp, void const *obj, int use_count)
void boost_debug_count_ptrs()
std::ostream & operator<<(std::ostream &str, const Backtrace &bt)
void boost_debug_shared_ptr_show_live_debugging(bool yn)
std::multimap< void const *, SPDebug * > PointerMap
IPointerMap & interesting_pointers()
void boost_debug_shared_ptr_destructor(void const *sp, void const *obj, int use_count)
void sp_counter_release_hook(void *, long)
void sp_array_constructor_hook(void *)
std::map< void const *, const char * > IPointerMap
void sp_scalar_constructor_hook(void *)
static bool is_interesting_object(void const *ptr)
void boost_debug_shared_ptr_reset(void const *sp, void const *old_obj, int old_use_count, void const *obj, int new_use_count)
void boost_debug_list_ptrs()
static PointerMap * _sptrs
void boost_debug_shared_ptr_mark_interesting(void *ptr, const char *type)