2012-04-13 1 views
4

멀티 코어 컴퓨터에서 실행되는 다중 스레드 프로그램 (Linux 플랫폼에서 Pthreads를 사용하여 C로 구현)이 있습니다. 내 코드에서 가지고있는 메모리 문제를 찾기 위해 --memcheck 옵션과 함께 ValGrind를 사용하고 있습니다. 그러나 그것은 달려있다. 문제의 전체 개요를 알려면 여기에 배경이 있습니다.다중 스레드 프로그램을 프로파일 링하기 위해 Valgrind가 걸려 있습니다.

코드는 초기화의 일부로 시작 부분에 순차적 인 부분을 가지고 있으며 나중에 Pthread API를 사용하여 8 개의 스레드를 만들고 완료 할 때 렁을 만듭니다. 내 코드는 언젠가 "코어"를 덤프합니다. 나는 GDB를 사용했다. 다음과 같은 추적을 제공한다. 나는 그것이 문제가 있는지 정확한 코드의 위치를 ​​제공하지 않습니다 -g 옵션없이 O 플래그를 사용하지만

======= Backtrace: ========= 
/lib/tls/i686/cmov/libc.so.6[0xb7cd47cd] 
/lib/tls/i686/cmov/libc.so.6(cfree+0x90)[0xb7cd7e30] 
/home/kumar/CycleSim/slack_cp/sim-outorder[0x819a6c9] 
/home/kumar/CycleSim/slack_cp/sim-outorder[0x8167e3e] 
/home/kumar/CycleSim/slack_cp/sim-outorder[0x804f5e4] 
/lib/tls/i686/cmov/libpthread.so.0[0xb7f8c31b] 
/lib/tls/i686/cmov/libc.so.6(clone+0x5e)[0xb7d3c57e] 
======= Memory map: ======== 
08048000-081b5000 r-xp 00000000 08:11 11813248 
/home/kumar/CycleSim/slack_cp/sim-outorder 
081b5000-081b8000 rw-p 0016c000 08:11 11813248 
/home/kumar/CycleSim/slack_cp/sim-outorder 
081b8000-08549000 rw-p 081b8000 00:00 0   [heap] 
ab9fd000-ab9fe000 ---p ab9fd000 00:00 0 
ab9fe000-ac1fe000 rw-p ab9fe000 00:00 0 
ac1fe000-ac1ff000 ---p ac1fe000 00:00 0 
ac1ff000-ac9ff000 rw-p ac1ff000 00:00 0 
ac9ff000-aca00000 ---p ac9ff000 00:00 0 
aca00000-ad2cb000 rw-p aca00000 00:00 0 
ad2cb000-ad300000 ---p ad2cb000 00:00 0 
ad3bf000-ad3c0000 ---p ad3bf000 00:00 0 
ad3c0000-adbc0000 rw-p ad3c0000 00:00 0 
adbc0000-adbc1000 ---p adbc0000 00:00 0 
adbc1000-ae3c1000 rw-p adbc1000 00:00 0 
ae3c1000-ae3c2000 ---p ae3c1000 00:00 0 
ae3c2000-aebc2000 rw-p ae3c2000 00:00 0 
aebc2000-aebc3000 ---p aebc2000 00:00 0 
aebc3000-b2e7d000 rw-p aebc3000 00:00 0 
b2e7d000-b2e7e000 ---p b2e7d000 00:00 0 
b2e7e000-b367e000 rw-p b2e7e000 00:00 0 
b367e000-b367f000 ---p b367e000 00:00 0 
b367f000-b7c6d000 rw-p b367f000 00:00 0 
b7c6d000-b7da8000 r-xp 00000000 08:01 12895490 /lib/tls/i686/cmov/libc-2.5.so 
b7da8000-b7da9000 r--p 0013b000 08:01 12895490 /lib/tls/i686/cmov/libc-2.5.so 
b7da9000-b7dab000 rw-p 0013c000 08:01 12895490 /lib/tls/i686/cmov/libc-2.5.so 
b7dab000-b7dae000 rw-p b7dab000 00:00 0 
b7dae000-b7dde000 r-xp 00000000 08:21 3828021 /usr/lib/libgslcblas.so.0.0.0 
b7dde000-b7ddf000 rw-p 0002f000 08:21 3828021 /usr/lib/libgslcblas.so.0.0.0 
b7ddf000-b7f7d000 r-xp 00000000 08:21 3828022 /usr/lib/libgsl.so.0.9.0 
b7f7d000-b7f87000 rw-p 0019d000 08:21 3828022 /usr/lib/libgsl.so.0.9.0 
b7f87000-b7f9a000 r-xp 00000000 08:01 12895516 
/lib/tls/i686/cmov/libpthread-2.5.so 
b7f9a000-b7f9c000 rw-p 00013000 08:01 12895516 
/lib/tls/i686/cmov/libpthread-2.5.so 
b7f9c000-b7f9f000 rw-p b7f9c000 00:00 0 
b7f9f000-b7fc4000 r-xp 00000000 08:01 12895498 /lib/tls/i686/cmov/libm-2.5.so 
b7fc4000-b7fc6000 rw-p 00024000 08:01 12895498 /lib/tls/i686/cmov/libm-2.5.so 
b7fc9000-b7fd4000 r-xp 00000000 08:01 12861504 /lib/libgcc_s.so.1 
b7fd4000-b7fd5000 rw-p 0000a000 08:01 12861504 /lib/libgcc_s.so.1 
b7fd5000-b7fd9000 rw-p b7fd5000 00:00 0 
b7fd9000-b7ff2000 r-xp 00000000 08:01 12861461 /lib/ld-2.5.so 
b7ff2000-b7ff4000 rw-p 00019000 08:01 12861461 /lib/ld-2.5.so 
bf8a0000-bf8b5000 rw-p bf8a0000 00:00 0   [stack] 
ffffe000-fffff000 r-xp 00000000 00:00 0   [vdso] 

. I

인터넷을 검색 한 후에 나는 그것이 메모리를 손상시키고 있기 때문에 온다고 이해했다. 경계 밖으로 배열에 데이터를 쓰거나 (예, 큰 배열을 사용하고 있지만 배열의 모든 요소에 액세스하기 전에 명시 적으로 확인하고 있습니다) 또는 불법적 인 힙 메모리에 액세스합니다. 코드가 거대하기 때문에 나는 단지 그것을보고 이해할 수는 없습니다. 그래서 저는 ValGrind를 방문하여 메모리 손상이 발생한 곳을 확인했습니다. ValGrind로 코드를 실행했지만 코드의 순차 부분까지 잘 실행되지만 병렬 파트 (Pthread 작성 파트)에서는 아무 것도하지 않습니다. "top -H -p pid"의 도움으로 모든 스레드가 생성되었지만 절전 모드에 있음을 알 수 있습니다. 오랜 시간 동안 실행 한 원래 코드 (valgrind가없는)는 멈추지 않습니다 (하지만 교착 상태가 발생하지 않음을 보장 할 수는 없습니다). Helgrind (valgrind의 스레드 오류 감지기)가 유용합니까?

누구나 문서 또는 유사한 문제를 지적 할 수 있습니다. 그것은 ValGrind 버전 2입니다. 기계는 i686, 리눅스 운영 체제입니다.

감사 D. L. 쿠마

+0

C 코드에서 스 니펫을 공유 할 수 있습니까? – codelion

+1

그게 아주 아주 거대한 코드 데이터베이스. 이상 15K 라인 및 많은 외부 라이브러리에 따라. 그 이유는, 코드의 모든 구석을보기 위해 일주일을 보낸 후에, 나는이 문제를 발견 할 수 없었고 이러한 자동 도구를 찾지 못했습니다. –

+1

우선, 새로운 Valgrind 버전으로 시도해보십시오. – Malkocoglu

답변

1

는이 사건에 대한 문제를 일으킬 수있는 경우에 당신이 확실하지, 단일 코어에서 실행이 valgrind stalls in multithreaded socket program Valgrind의 힘 응용 프로그램을 확인할 수 있습니다 될 수 있습니다.

+1

Thats에 설명 된 것과 동일한 문제가 발생할 수 있습니다. 흥미로운 점이며 이것이 분명히 중요한 문제라고 생각합니다. 이 문제를 지적 해 주셔서 감사합니다. 모든 스레드를 명시 적으로 (자신의 스케줄링을 돌보는) 8 개 코어 (내 호스트 시스템은 8 코어 머신)에서 실행되도록 매핑합니다. Valgrind는 기본적으로 x86 플랫폼의 에뮬레이션이므로 하나의 코어에서만 실행할 수 있습니다. –

+1

이제는 모든 스레드를 단일 코어에서 실행했습니다 (지금 디버깅하기 위해). 정지 상태가 아닙니다. 그러나이 도구의 유용성이 무엇인지 궁금합니다. 진정한 동시성 문제는 멀티 코어에서 실행될 때만 발생합니다. 스레드 동시성 검사기 인 Helgrind가 있습니다. 적어도 평행선이어야합니다. –

+2

나는 살아있는 클라이언트 연결이 많은 멀티 스레드 프로그램에서 valgrind를 사용했는데 문제없이 작동했습니다. 조금 느려졌습니다 ... – Malkocoglu