2009-09-27 12 views
5

我需要使用Valgrind来检测服务器应用程序中发生的任何内存访问冲突。服务器创建许多线程。我怀疑有一个竞赛条件导致服务器每隔1小时左右崩溃。我们使用Valgrind来分析其内存使用情况,但服务器进程的速度急剧下降。服务器的速度下降很多,几乎没有可用性,没有可能的赛车条件。如何与我们的流程并行运行Valgrind,以便其性能不会降低太多?

有没有办法与我们的应用程序并行运行Valgrind,所以我们不会失去那么多的性能?

回答

5

值得注意的是,Valgrind虽然支持多线程程序,但如果您有多核可用,它并不会实际运行程序的线程。它还以比本地OS调度程序更细的粒度交错线程。这两个事实相结合可能会使它具有竞争条件或其他并发异常的程序行为会有所不同。

您可能需要尝试Helgrind,这是一种主要用于检测正确锁定规则的工具,而drd是一种主要用于检测数据竞争的工具。

1

这不是直接回答您的问题,但是如果您怀疑同步错误,您是否尝试过使用Valgrind工具Helgrind

+0

因为我不是专业的Valgrind用户,所以我之前并不知道Helgrind。我今天才知道。我怀疑是一个对象正在被删除,但另一个线程正试图访问它,并导致进程崩溃。这很可能是因为该应用程序编码非常差。我会尝试Helgrind,看看它能提供什么。 – 2009-09-27 19:11:18

9

你不能那样做。 Valgrind本质上并不实际执行你的代码,而是在模拟器中运行它。这就是为什么它如此缓慢。所以,没有办法让它跑得更快,并且仍然可以得到Valgrind的好处。

最好的办法是设置ulimit,以便程序在崩溃时生成核心文件。然后,您可以通过检查核心来设法解决问题。

+1

+1,我正要给出几乎相同的答案。 – 2009-09-27 15:55:27

0

Valgrind通过挂接到你的malloc调用中工作,所以你可以期望你的程序在valgrind下运行得更慢。所以,我会说,你不能在valgrind 得到分析内存错误的好处时更快地运行你的程序。