breakfastquay / rubberband

Official mirror of Rubber Band Library, an audio time-stretching and pitch-shifting library.
http://breakfastquay.com/rubberband/
GNU General Public License v2.0
566 stars 91 forks source link

Obscure crash in Rubberband::Profiler #7

Closed jamiebullock closed 3 years ago

jamiebullock commented 6 years ago

This happened to me once, and I certainly can't reproduce it. It's possible my program is at fault and not RubberBand, however I'm posting this here in case there's some obviously fixable issue with RB from looking at the call stack.

Basically, I was stress testing my app under the debugger by "clicking around wildly" and this happened:

Thread 110: EXC_BAD_ACCESS (code=1, address=0x18)

#0  0x0000000117e22d03 in void std::__1::__tree_balance_after_insert<std::__1::__tree_node_base<void*>*>(std::__1::__tree_node_base<void*>*, std::__1::__tree_node_base<void*>*) at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/__tree:277
#1  0x0000000117e2f522 in std::__1::__tree<std::__1::__value_type<char const*, float>, std::__1::__map_value_compare<char const*, std::__1::__value_type<char const*, float>, std::__1::less<char const*>, true>, std::__1::allocator<std::__1::__value_type<char const*, float> > >::__insert_node_at(std::__1::__tree_end_node<std::__1::__tree_node_base<void*>*>*, std::__1::__tree_node_base<void*>*&, std::__1::__tree_node_base<void*>*) at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/__tree:2085
#2  0x0000000117e2e3f7 in std::__1::pair<std::__1::__tree_iterator<std::__1::__value_type<char const*, float>, std::__1::__tree_node<std::__1::__value_type<char const*, float>, void*>*, long>, bool> std::__1::__tree<std::__1::__value_type<char const*, float>, std::__1::__map_value_compare<char const*, std::__1::__value_type<char const*, float>, std::__1::less<char const*>, true>, std::__1::allocator<std::__1::__value_type<char const*, float> > >::__emplace_unique_key_args<char const*, std::__1::piecewise_construct_t const&, std::__1::tuple<char const* const&>, std::__1::tuple<> >(char const* const&, std::__1::piecewise_construct_t const&&&, std::__1::tuple<char const* const&>&&, std::__1::tuple<>&&) at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/__tree:2112
#3  0x0000000117e26fce in std::__1::map<char const*, float, std::__1::less<char const*>, std::__1::allocator<std::__1::pair<char const* const, float> > >::operator[](char const* const&) at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/map:1366
#4  0x0000000117e26d64 in RubberBand::Profiler::add(char const*, float) at /Users/jamie/Documents/plugin/Source/External/rubberband/src/base/Profiler.cpp:63
#5  0x0000000117e2ba09 in RubberBand::Profiler::end() at /Users/jamie/Documents/plugin/Source/External/rubberband/src/base/Profiler.cpp:209
#6  0x0000000117e2b937 in RubberBand::Profiler::~Profiler() at /Users/jamie/Documents/plugin/Source/External/rubberband/src/base/Profiler.cpp:186
#7  0x0000000117e2ba35 in RubberBand::Profiler::~Profiler() at /Users/jamie/Documents/plugin/Source/External/rubberband/src/base/Profiler.cpp:185
#8  0x0000000117e7f20f in RubberBand::RubberBandStretcher::Impl::modifyChunk(unsigned long, unsigned long, bool) at /Users/jamie/Documents/plugin/Source/External/rubberband/src/StretcherProcess.cpp:902
#9  0x0000000117e7d2ab in RubberBand::RubberBandStretcher::Impl::processChunkForChannel(unsigned long, unsigned long, unsigned long, bool) at /Users/jamie/Documents/plugin/Source/External/rubberband/src/StretcherProcess.cpp:473
#10 0x0000000117e7bc97 in RubberBand::RubberBandStretcher::Impl::processChunks(unsigned long, bool&, bool&) at /Users/jamie/Documents/plugin/Source/External/rubberband/src/StretcherProcess.cpp:308
#11 0x0000000117e7b6bc in RubberBand::RubberBandStretcher::Impl::ProcessThread::run() at /Users/jamie/Documents/plugin/Source/External/rubberband/src/StretcherProcess.cpp:82
#12 0x0000000117e41dce in RubberBand::Thread::staticRun(void*) at /Users/jamie/Documents/plugin/Source/External/rubberband/src/system/Thread.cpp:367
cannam commented 3 years ago

Fixed in hg commit 45c248b6bab8! Only a little over three years, not bad. Ahem.

Of course this could happen only in debug mode (the profiler class is eliminated in release builds). It was caused by a map being accessed without a mutex when the profiler saved its findings on exiting scope, and of course this can happen more than once simultaneously in multi-channel multi-threaded mode.