Debug boost :: thread application, высокий уровень ложных срабатываний - PullRequest
6 голосов
/ 03 ноября 2011

Я запрограммировал приложение boost :: thread, где у меня могут быть некоторые условия гонки.Я хочу отладить эту программу.Поэтому я использовал следующие инструменты valgrind:

  1. halgrind
  2. drd

к сожалению, они имеют очень ложный положительный показатель.Так что с действительно простой программой ниже valgrind --tool=drd жалуется на 94 ошибки, которых не должно быть.Так что с моей сложной программой я получаю около 15000 ошибок.Таким образом, действительно трудно найти фактическую ошибку.

Я мог бы воспроизвести это поведение со следующими библиотеками повышения 1.46.0 и 1.47.0.И с Valgrind 3.7.0 SVN и Valgrind 3.8.0 SVN.Операционные системы, которые я пробовал там, где Ubuntu 11.10 и Mac OS X 10.7.Компилятор, где gcc 4.2.1 и gcc 4.6.1.

#include <iostream>
#include <boost/thread.hpp>

void run()
{
    //do some stuff here
}

int main(int argc, char* argv[])
{
    boost::thread thread(run);
    thread.join();
    std::cerr << "main: done" << std::endl;
    return 0;
}
;

Как вы отлаживаете свои программы потока потока?Существуют ли другие инструменты, которые могли бы лучше подойти?

Решение

Кажется, что valgrind после версии 3.6.1 не работает.Если я использую valgrind 3.6.1, все работает нормально.

Здесь вы найдете сообщение об ошибке от valgrind --tool=drd:

==60767== Thread 1:
==60767== Conflicting store by thread 1 at 0x100026ec0 size 8
==60767==    at 0x2A316E: pthread_mutex_lock (in /usr/lib/system/libsystem_c.dylib)
==60767==    by 0x2A82FA: _pthread_cond_wait (in /usr/lib/system/libsystem_c.dylib)
==60767==    by 0x32A4E: boost::condition_variable::wait(boost::unique_lock<boost::mutex>&) (in /usr/local/lib/libboost_thread.dylib)
==60767==    by 0x2BE5A: boost::thread::join() (in /usr/local/lib/libboost_thread.dylib)
==60767==    by 0x10000195C: main (in ./playgroudThreads)
==60767== Address 0x100026ec0 is at offset 144 from 0x100026e30. Allocation context:
==60767==    at 0xC5B3: malloc (vg_replace_malloc.c:266)
==60767==    by 0x9968D: operator new(unsigned long) (in /usr/lib/libstdc++.6.0.9.dylib)
==60767==    by 0x1000069ED: boost::detail::thread_data<void (*)()>* boost::detail::heap_new_impl<boost::detail::thread_data<void (*)()>, void (*&)()>(void (*&)()) (in ./playgroudThreads)
==60767==    by 0x100006A87: boost::detail::thread_data<void (*)()>* boost::detail::heap_new<boost::detail::thread_data<void (*)()>, void (*)()>(void (*&)()) (in ./playgroudThreads)
==60767==    by 0x100006ACA: boost::shared_ptr<boost::detail::thread_data_base> boost::thread::make_thread_info<void (*)()>(void (*)()) (in ./playgroudThreads)
==60767==    by 0x100006B08: boost::thread::thread<void (*)()>(void (*)(), boost::disable_if<boost::is_convertible<void (*&)(), boost::detail::thread_move_t<void (*)()> >, boost::thread::dummy*>::type) (in ./playgroudThreads)
==60767==    by 0x100001950: main (in ./playgroudThreads)
==60767== Other segment start (thread 2)
==60767==    at 0x2A7B68: thread_start (in /usr/lib/system/libsystem_c.dylib)
==60767== Other segment end (thread 2)
==60767==    at 0x3E667A: mach_msg_trap (in /usr/lib/system/libsystem_kernel.dylib)
==60767==    by 0x3DED38: semaphore_create (in /usr/lib/system/libsystem_kernel.dylib)
==60767==    by 0x2A50F7: new_sem_from_pool (in /usr/lib/system/libsystem_c.dylib)
==60767==    by 0x2A6199: _pthread_exit (in /usr/lib/system/libsystem_c.dylib)
==60767==    by 0x2A48C9: _pthread_start (in /usr/lib/system/libsystem_c.dylib)
==60767==    by 0x2A7B74: thread_start (in /usr/lib/system/libsystem_c.dylib)

1 Ответ

1 голос
/ 04 ноября 2011

Из Руководство по DRD

Важным преимуществом детекторов данных перед запуском данных является то, что они не сообщают о ложных срабатываниях.DRD основан на алгоритме «до того, как это произойдет».

Таким образом, DRD не имеет ложных срабатываний, если реализация использует только потоки POSIX, а не не-POSIX, такие как futex Linux.

Поэтому, если DRD сообщает о ложноположительных результатах, напрограмма без гонок, как ваша, в ней есть ошибка.У него не должно быть ложных срабатываний.

Однако я не смог воспроизвести ошибки, о которых вы сообщили, на моей машине (Archlinux / gcc 4.6.2 / valgrind 3.6.1 / boost 1.47).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...