- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在让 Helgrind 和 DRD 使用 g++ 和 C++11 线程时遇到问题。
我的设置: - RedHad Linux 2.6 -克++ 4.7.2 - Valgrind 3.7.0
我试过贴出的程序 here ,在添加第一个答案中列出的定义之后,因此:
#include <valgrind/helgrind.h>
#define _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(addr) ANNOTATE_HAPPENS_BEFORE(addr)
#define _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(addr) ANNOTATE_HAPPENS_AFTER(addr)
#define _GLIBCXX_EXTERN_TEMPLATE -1
#include <thread>
int main()
{
std::thread t( []() { } );
t.join();
return 0;
}
然后我构建程序:
$ g++ -std=c++11 -Wall -Wextra -pthread main.cc
程序(没有做太多)正确运行:
$ ./a.out
还有 valgrind:
$ valgrind ./a.out
==21284== Memcheck, a memory error detector
==21284== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==21284== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==21284== Command: ./a.out
==21284==
==21284==
==21284== HEAP SUMMARY:
==21284== in use at exit: 0 bytes in 0 blocks
==21284== total heap usage: 2 allocs, 2 frees, 344 bytes allocated
==21284==
==21284== All heap blocks were freed -- no leaks are possible
==21284==
==21284== For counts of detected and suppressed errors, rerun with: -v
==21284== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 6 from 6)
但是,对于 Helgrind,我得到了误报:
$ valgrind --tool=helgrind ./a.out
==21467== Helgrind, a thread error detector
==21467== Copyright (C) 2007-2011, and GNU GPL'd, by OpenWorks LLP et al.
==21467== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==21467== Command: ./a.out
==21467==
==21467== ---Thread-Announcement------------------------------------------
==21467==
==21467== Thread #1 is the program's root thread
==21467==
==21467== ---Thread-Announcement------------------------------------------
==21467== [lines removed]
==21467==
==21467== ----------------------------------------------------------------
==21467==
==21467== Possible data race during write of size 8 at 0x5B7A058 by thread #1
==21467== Locks held: none
==21467== [lines removed]
==21467==
==21467== This conflicts with a previous write of size 8 by thread #2
==21467== Locks held: none
==21467== at 0x4EE0A25: execute_native_thread_routine (shared_ptr_base.h:587)
==21467== by 0x4C2D3AD: mythread_wrapper (hg_intercepts.c:219)
==21467== by 0x55D1850: start_thread (in /lib64/libpthread-2.12.so)
==21467== by 0x58CF90C: clone (in /lib64/libc-2.12.so)
==21467==
==21467== [lines removed]
==21467==
==21467==
==21467== For counts of detected and suppressed errors, rerun with: -v
==21467== Use --history-level=approx or =none to gain increased speed, at
==21467== the cost of reduced accuracy of conflicting-access information
==21467== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
使用 DRD 而不是 Helgrind 的类似虚假报告。
知道哪里出了问题吗?
最佳答案
我找到了 this在drd手册中。看来您需要重新编译函数 execute_native_thread_routine() 和 std::thread::_M_start_thread(),并将其与您的程序链接(并且在这些函数的执行时不使用共享库)。
实际上,您的代码可以看到宏 _GLIBCXX_SYNCHRONIZATION_HAPPENS_*,但在构建此库时,它们不会被 c++ 库代码的内部函数看到。这就是为什么您需要使用您用于代码的相同 header 包含和宏定义来重新编译它们。
关于c++ - 无法让 Helgrind/DRD 使用 C++11 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24060626/
Helgrind 在运行时卡住。必须使用 CTRL+C (SIGINT) 才能退出运行。 我编写了一个可以正确执行的程序,如果以通常的方式运行而不使用 --tool=helgrind,valgrind
如前所述there , Meyer 的单例在 C++11 中是线程安全的。 所以我希望这段代码没问题: #include #include struct key_type { int va
我在 cplusplus.com 尝试了使用 atomic_flag 的基本示例. Valgrind 的 Helgrind 工具报告 164 errors from 28 contexts (supp
我的线程同步“风格”似乎正在摆脱 helgrind。这是一个重现问题的简单程序: #include #include #include int main() { std::atomic
我正在使用 pthreads 在 C++ 中的 Linux 上制作 Web 服务器。我用 valgrind 测试了它是否存在泄漏和内存问题 - 都已修复。我用 helgrind 测试了它的线程问题 -
**已解决:在我类(class)的构造函数中,我有一个信号量的构造与线程的构造竞争,我希望先创建信号量,然后再创建线程。对我有用的解决方案是首先在基类中创建信号量,这样我就可以在派生类中依赖它。 **
我正在调试一些线程代码,并且正在使用 valgrind --tool=helgrind,出于某种原因,helgrind 不喜欢下面的简单示例。 在我启动一个线程之前,我锁定了互斥体。在线程结束时,我将
Helgrind is a Valgrind tool for detecting synchronisation errors in C, C++ and Fortran programs that
我正在 macOS 机器上学习 C,在让 Valgrind 工作方面遇到很多问题,尤其是线程和 Helgrind。看起来没有任何支持,这让我想知道是否: 没有人使用 macOS 开发 C/C++。 人
我想我发现了 Helgrind 工具返回的相当广泛的误报。也许这已在其他地方记录下来,但 Helgrind 工具似乎总是会错误地检测 Test and Test-And-Set pattern作为误报
在使用 Helgrind 分析我的程序时,我注意到我遇到了很多类似于以下的错误: ==8347== Possible data race during read of size 4 at 0x53C4
我有一个更大的多线程软件(专有且无法共享)报告来自 helgrind 的数据争用(请参阅下面的数据争用)。我不能分享这个软件,但我设计了一些测试来演示比赛。 与有问题的实际软件的竞争: ==7746=
看起来像Valgrind有两个工具都可以进行线程错误检测:Helgrind和 DRD .这些工具非常相似。 我的主要问题是:我什么时候应该使用一个而不是另一个来检查我的多线程代码? 更广泛地说,为什么
我观察到 helgrind 不会检测非递归 c++11 std::mutex 上的递归锁。但是,在使用 pthread_mutex_lock 时会检测到该问题。 两个简单的测试用例来演示问题: //
请看下面的代码 #include #include #include #include pthread_mutex_t g = PTHREAD_MUTE
出于某种原因,我无法使用 Helgrind 来检测 POSIX pthreads API 的滥用(例如,解锁非锁定互斥锁、释放包含锁定互斥锁的内存等)。我试图找到另一个工具,但实际上失败了。正如我所发
当我开始学习 valgrind(helgrind) 工具时,我遇到了一个我未能解决的棘手问题。 简单地说,一个用户定义的线程类是用一个虚拟函数创建的,该虚拟函数将被线程的入口例程调用。如果是这种情况,
我在脚本中的程序上运行 Valgrind 的 Helgrind 工具。 这是脚本的相关部分:(我只写了第一行) sudo valgrind --tool=helgrind ./core-lin
当我将我的代码转换为 C++11 时,我非常想将我的 pthread 代码转换为 std::thread。但是,我似乎在 drd 和 helgrind 中的非常简单的程序中遇到了错误的竞争条件。 #i
我在让 Helgrind 和 DRD 使用 g++ 和 C++11 线程时遇到问题。 我的设置: - RedHad Linux 2.6 -克++ 4.7.2 - Valgrind 3.7.0 我试过贴
我是一名优秀的程序员,十分优秀!