멀티 코어 컴퓨터에서 실행되는 다중 스레드 프로그램 (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. 쿠마
C 코드에서 스 니펫을 공유 할 수 있습니까? – codelion
그게 아주 아주 거대한 코드 데이터베이스. 이상 15K 라인 및 많은 외부 라이브러리에 따라. 그 이유는, 코드의 모든 구석을보기 위해 일주일을 보낸 후에, 나는이 문제를 발견 할 수 없었고 이러한 자동 도구를 찾지 못했습니다. –
우선, 새로운 Valgrind 버전으로 시도해보십시오. – Malkocoglu