f4exb / sdrangel

SDR Rx/Tx software for Airspy, Airspy HF+, BladeRF, HackRF, LimeSDR, PlutoSDR, RTL-SDR, SDRplay and FunCube
GNU General Public License v3.0
2.94k stars 447 forks source link

DeviceAPI::removeSinkBuddy core dump at destruction time #359

Closed f4exb closed 5 years ago

f4exb commented 5 years ago

This occurs for Rx/Tx devices like LimeSDR, HackRF... with a Rx and Tx device set opened for the same device. Scenario is to start Tx stop it and leave Rx alone all the time. Then shutting down the application (ctl-q).

Dump occurs because an attempt is made to remove an item from an empty vector:

#7  0x00007f3fc35af78e in DeviceAPI::removeSinkBuddy (this=0x55bf7c52ea80, buddy=0x7f3fac0013f0) at /opt/build/sdrangel/sdrbase/device/deviceapi.cpp:728
728             m_sourceBuddies.erase(it);
(gdb) p m_sourceBuddies
$1 = std::vector of length 0, capacity 0

Full stack trace:

#0  __memmove_avx_unaligned_erms () at ../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:371
371 ../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S: No such file or directory.
[Current thread is 1 (Thread 0x7f3fc4547c80 (LWP 29285))]
(gdb) bt
#0  0x00007f3fc1505c40 in __memmove_avx_unaligned_erms () at ../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:371
#1  0x00007f3fc35b1a33 in std::__copy_move<true, true, std::random_access_iterator_tag>::__copy_m<DeviceAPI*>(DeviceAPI* const*, DeviceAPI* const*, DeviceAPI**) (__first=0x55bf7d3a8968, __last=0x0, __result=0x55bf7d3a8960)
    at /usr/include/c++/7/bits/stl_algobase.h:368
#2  0x00007f3fc35b199f in std::__copy_move_a<true, DeviceAPI**, DeviceAPI**>(DeviceAPI**, DeviceAPI**, DeviceAPI**) (__first=0x55bf7d3a8968, __last=0x0, __result=0x55bf7d3a8960) at /usr/include/c++/7/bits/stl_algobase.h:386
#3  0x00007f3fc35b179d in std::__copy_move_a2<true, __gnu_cxx::__normal_iterator<DeviceAPI**, std::vector<DeviceAPI*, std::allocator<DeviceAPI*> > >, __gnu_cxx::__normal_iterator<DeviceAPI**, std::vector<DeviceAPI*, std::allocator<DeviceAPI*> > > >(__gnu_cxx::__normal_iterator<DeviceAPI**, std::vector<DeviceAPI*, std::allocator<DeviceAPI*> > >, __gnu_cxx::__normal_iterator<DeviceAPI**, std::vector<DeviceAPI*, std::allocator<DeviceAPI*> > >, __gnu_cxx::__normal_iterator<DeviceAPI**, std::vector<DeviceAPI*, std::allocator<DeviceAPI*> > >) (__first=0x0, __last=non-dereferenceable iterator for std::vector, __result=0x7f3fac0013f0) at /usr/include/c++/7/bits/stl_algobase.h:422
#4  0x00007f3fc35b155d in std::move<__gnu_cxx::__normal_iterator<DeviceAPI**, std::vector<DeviceAPI*, std::allocator<DeviceAPI*> > >, __gnu_cxx::__normal_iterator<DeviceAPI**, std::vector<DeviceAPI*, std::allocator<DeviceAPI*> > > >(__gnu_cxx::__normal_iterator<DeviceAPI**, std::vector<DeviceAPI*, std::allocator<DeviceAPI*> > >, __gnu_cxx::__normal_iterator<DeviceAPI**, std::vector<DeviceAPI*, std::allocator<DeviceAPI*> > >, __gnu_cxx::__normal_iterator<DeviceAPI**, std::vector<DeviceAPI*, std::allocator<DeviceAPI*> > >) (__first=0x0, __last=non-dereferenceable iterator for std::vector, __result=0x7f3fac0013f0) at /usr/include/c++/7/bits/stl_algobase.h:488
#5  0x00007f3fc35b0e27 in std::vector<DeviceAPI*, std::allocator<DeviceAPI*> >::_M_erase(__gnu_cxx::__normal_iterator<DeviceAPI**, std::vector<DeviceAPI*, std::allocator<DeviceAPI*> > >) (this=0x55bf7c52eae8, __position=0x7f3fac0013f0)
    at /usr/include/c++/7/bits/vector.tcc:157
#6  0x00007f3fc35b03ff in std::vector<DeviceAPI*, std::allocator<DeviceAPI*> >::erase(__gnu_cxx::__normal_iterator<DeviceAPI* const*, std::vector<DeviceAPI*, std::allocator<DeviceAPI*> > >) (this=0x55bf7c52eae8, __position=0x7f3fac0013f0) at /usr/include/c++/7/bits/stl_vector.h:1180
#7  0x00007f3fc35af78e in DeviceAPI::removeSinkBuddy(DeviceAPI*) (this=0x55bf7c52ea80, buddy=0x7f3fac0013f0) at /opt/build/sdrangel/sdrbase/device/deviceapi.cpp:728
#8  0x00007f3fc35afa7f in DeviceAPI::clearBuddiesLists() (this=0x7f3fac0013f0) at /opt/build/sdrangel/sdrbase/device/deviceapi.cpp:754
#9  0x00007f3fc3fd29b7 in MainWindow::removeLastDevice() (this=0x7fff19a81f30) at /opt/build/sdrangel/sdrgui/mainwindow.cpp:552
#10 0x00007f3fc3fda86d in MainWindow::on_action_Exit_triggered() (this=0x7fff19a81f30) at /opt/build/sdrangel/sdrgui/mainwindow.cpp:1941
#11 0x00007f3fc40abe94 in MainWindow::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) (_o=0x7fff19a81f30, _c=QMetaObject::InvokeMetaMethod, _id=35, _a=0x7fff19a816a0)
    at /opt/build/sdrangel/build.debug/sdrgui/sdrgui_autogen/EWIEGA46WW/moc_mainwindow.cpp:259
#12 0x00007f3fc40abfd4 in MainWindow::qt_metacall(QMetaObject::Call, int, void**) (this=0x7fff19a81f30, _c=QMetaObject::InvokeMetaMethod, _id=35, _a=0x7fff19a816a0)
    at /opt/build/sdrangel/build.debug/sdrgui/sdrgui_autogen/EWIEGA46WW/moc_mainwindow.cpp:293
#13 0x00007f3fc1fc2679 in QMetaObject::activate(QObject*, int, int, void**) () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#14 0x00007f3fc2d0b122 in QAction::triggered(bool) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#15 0x00007f3fc2d0d80c in QAction::activate(QAction::ActionEvent) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#16 0x00007f3fc2d0e0d5 in QAction::event(QEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#17 0x00007f3fc2d1182c in QApplicationPrivate::notify_helper(QObject*, QEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#18 0x00007f3fc2d190f4 in QApplication::notify(QObject*, QEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#19 0x00007f3fc1f939a8 in QCoreApplication::notifyInternal2(QObject*, QEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#20 0x00007f3fc25833b7 in QShortcutMap::dispatchEvent(QKeyEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5
#21 0x00007f3fc258348a in QShortcutMap::tryShortcut(QKeyEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5
#22 0x00007f3fc2531c63 in QWindowSystemInterface::handleShortcutEvent(QWindow*, unsigned long, int, QFlags<Qt::KeyboardModifier>, unsigned int, unsigned int, unsigned int, QString const&, bool, unsigned short) ()
    at /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5
#23 0x00007f3fc2551f97 in QGuiApplicationPrivate::processKeyEvent(QWindowSystemInterfacePrivate::KeyEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5
#24 0x00007f3fc2556fd5 in QGuiApplicationPrivate::processWindowSystemEvent(QWindowSystemInterfacePrivate::WindowSystemEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5
#25 0x00007f3fc252e2eb in QWindowSystemInterface::sendWindowSystemEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5
#26 0x00007f3fb769e1c0 in  () at /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5
#27 0x00007f3fbdabe417 in g_main_context_dispatch () at /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
#28 0x00007f3fbdabe650 in  () at /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
#29 0x00007f3fbdabe6dc in g_main_context_iteration () at /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
#30 0x00007f3fc1fec8ef in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#31 0x00007f3fc1f919ea in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#32 0x00007f3fc1f9aa84 in QCoreApplication::exec() () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#33 0x000055bf7a4fadc8 in runQtApplication(int, char**, qtwebapp::LoggerWithFile*) (argc=3, argv=0x7fff19a822e8, logger=0x55bf7b8308a0) at /opt/build/sdrangel/app/main.cpp:134
#34 0x000055bf7a4fb035 in main(int, char**) (argc=3, argv=0x7fff19a822e8) at /opt/build/sdrangel/app/main.cpp:141

Offending part of the code sdrbase/device/deviceapi.cpp starting line 719:

    for (;it != m_sinkBuddies.end(); ++it)
    {
        if (*it == buddy)
        {
            qDebug("DeviceAPI::removeSinkBuddy: buddy %s(%s) [%llu] removed from the list of [%llu]",
                    qPrintable(buddy->getHardwareId()),
                    qPrintable(buddy->getSamplingDeviceSerial()),
                    (quint64) (*it),
                    (quint64) this);
            m_sourceBuddies.erase(it);
            return;
        }
    }

Edit: also occurs if you have been using the Rx part.

f4exb commented 5 years ago

Looks like a copy+paste error.

f4exb commented 5 years ago

So line 728 has to be replaced with: m_sinkBuddies.erase(it);