2009-09-27 6 views
5

Potrzebuję użyć Valgrind do wykrycia wszelkich naruszeń dostępu do pamięci dokonanych w aplikacji serwera. Serwer tworzy wiele wątków. Podejrzewam, że istnieje warunek wyścigowy, który powoduje awarię serwera co godzinę. Użyliśmy Valgrind do analizy użycia pamięci, ale szybkość procesu serwera znacznie się zmniejszyła. Szybkość serwera zmniejszyła się tak bardzo, że było mało użyteczne, a warunki wyścigowe nie były prawdopodobne.Jak uruchomić Valgrind równolegle z naszym procesem, aby jego wydajność nie spadła zbytnio?

Czy mimo to można uruchomić Valgrind równolegle z naszą aplikacją, abyśmy nie stracili tak dużego wyniku?

Odpowiedz

5

Warto zauważyć, że Valgrind, wspierając programy wielowątkowe, nie będzie w rzeczywistości uruchamiał wątków programu równolegle, jeśli dostępne są wielordzeniowe rdzenie. Ponadto przeplata wątki o drobniejszym ziarnie niż macierzysty program planujący systemu operacyjnego. Te dwa fakty połączone mogą sprawić, że program z warunkami wyścigu lub innymi współbieżnymi anomaliami będzie się różnił.

Być może warto wypróbować Helgrind, narzędzie mające na celu przede wszystkim wykrycie poprawnej dyscypliny blokowania oraz narzędzie służące głównie do wykrywania wyścigów danych.

1

Nie odpowiada to bezpośrednio na twoje pytanie, ale jeśli podejrzewasz błąd synchronizacji, czy próbowałeś użyć narzędzia Valgrind Helgrind?

+0

Nie wiedziałem o Helgrind wcześniej, ponieważ nie jestem profesjonalnym użytkownikiem Valgrind. Właśnie się o tym dowiedziałem. Podejrzewam, że obiekt jest usuwany, ale inny wątek próbuje uzyskać do niego dostęp i to powoduje awarię procesu. Jest to wysoce prawdopodobne, ponieważ aplikacja została bardzo źle zakodowana. Wypróbuję Helgrind i zobaczę, co może zaoferować. –

9

Nie możesz tego zrobić. Valgrind nie wykonuje natywnie kodu - zamiast tego uruchamia go wewnątrz symulatora. Dlatego jest tak powolny. Tak więc, nie ma sposobu, aby przyspieszyć bieg, i nadal korzystać z zalet Valgrind.

Najlepiej jest ustawić ulimit, aby program generował plik core, gdy ulegnie awarii. Następnie możesz spróbować ustalić, na czym polega problem, badając rdzeń.

+1

+1, właśnie miałem dać prawie identyczną odpowiedź. –

0

Valgrind działa poprzez podłączenie do połączeń malloc, więc możesz oczekiwać, że twój program będzie działał wolniej w Valgrind. Powiedziałbym więc, że nie można uruchomić programu szybciej pod valgrind i uzyskać korzyści z analizy błędów pamięci.