2012-02-22 1 views
2

우선, 내가 잘못된 장소에 이것을 쓰고 있으면 사과하겠습니다. 나는이 성격의 물건을 게시하는 valgrind 사용자 포럼을 찾을 수없는 것 같습니다. 그리고이 장소는 상당히 포괄적 인 것처럼 보였으므로, 나는 그것을 시험해 보았습니다.정통 리눅스 커널과 valgrind

나는 내 코드를 실행할 때 활용할 필요가있는 다소 정통 리눅스 커널을 가지고있다. 필자는 필자가 작성하지 않았기 때문에 커널에 대해 너무 많이 모릅니다. 내 커널은 어떤 이유로 든 기본 리눅스 커널의 syscall 테이블을 확장하는 것처럼 보입니다. .ko 파일의 insmod에서 현재의 표준 syscall 테이블이 확장되어 333으로 시작하여 341로 진행되고 원래의 syscall 테이블이 저장되고, .so 파일이 복원 될 때 복원됩니다. ko는 rmmoded입니다. 이러한 추가 시스템 호출은 실행중인 독점 소프트웨어 인 과 일종의 고유 한 IPC 통신을 수행하는 것으로 보입니다.

물론 이것은 valgrind와 함께 지옥처럼 보입니다.

나는 물론 내 프로그램을 memcheck하는 Valgrind의를 사용하고자하지만, Valgrind의 항상 내 응용 프로그램이 시스템 콜을 수행하는 순간 충돌 것입니다. 는 여기에 내가 Valgrind의에서 얻을 출력, 마이너스 몇 가지 내가 차라리

==26045== Thread 2: 
==26045== Syscall param preadv(vector) points to unaddressable byte(s) 
==26045== at 0x4000982: ??? (in /lib/ld-2.9.so) 
==26045== by 0x426C756: syscall (in /lib/libc-2.9.so) 
==26045== by 0x4037430: com_lock (coms.c:114) 


--23932-- VALGRIND INTERNAL ERROR: Valgrind received a signal 11 (SIGSEGV) - exiting 
--23932-- si_code=1; Faulting address: 0x165; sp: 0x63a6dde4 

valgrind: the 'impossible' happened: 
    Killed by fatal signal 
==23932== at 0x3809D5E0: vgSysWrap_linux_sys_preadv_before (syswrap-linux.c:3413) 
==23932== by 0x380785CB: vgPlain_client_syscall (syswrap-main.c:1382) 
==23932== by 0x38076330: vgPlain_scheduler (scheduler.c:929) 
==23932== by 0x380A13E8: run_a_thread_NORETURN (syswrap-linux.c:98) 
==23932== by 0x380A1732: vgModuleLocal_start_thread_NORETURN (syswrap-linux.c:268) 
==23932== by 0x380A8AC8: ??? (in /usr/local/lib/valgrind/memcheck-x86-linux) 

나 이러한 추가 콜을 사용하지 불행히도 그것은 불가능하다. 내가 직면하고있는 도전은 어떻게 대처해야 하는가입니다.

지금까지 배운 것은 valgrind에서 새롭거나 사용자 정의 된 syscall 래퍼를 지정할 수 있다는 것입니다. 불행히도 나는 시스템 콜 주소가 내 런타임 동안 모두 전환 될 때이를 없애는 방법을 잘 모릅니다.

비표준 커널에 추가 한 syscall에 대한 valgrind syscall wrappers 작성 경험이있는 사람이라면 valgrind에게 wrapper를 전환하는 방법을 알기 때문에 자세한 내용, 참고 자료 등을 회신 해주십시오. 나는 정말로 감사 할 것입니다. 내가 g으로, Valgrind의 3.7 사용하고

는 ++ 4.1.1은 사용자 정의 커널 2.6.29 젠투 오프 내장

(모든 의도와 목적을 위해, 내 독점 커널 모듈이로드 될 때까지 2.6.29 젠투입니다) 편집 :

내가 처음 게시 한 이래로 이것과 관련된 몇 가지 사실을 발견했다. valgrind에는 include/vki/vki-scnums-x86-linux.h 파일이 있습니다. 그 안에있는 의견 (valgrind 3.7.0 기억하기)에 따르면 2.6.9 커널에서 asm-i386/unistd.h를 잘라내어 붙여 넣기가 가능합니다. 명령어 열거 333에서 __NR_preadv가 정의됩니다. 나를 위해 valgrind는 my_ipc라는 시스템 콜을 수행 할 때 죽습니다. my_ipc는 내 커널에 고유 한 시스템 콜이며 333 이외의 다른 시스템에서 열거됩니다. valgrind가 컴파일 된 것과 시스템 콜 매핑 오류가있는 것 같습니다. 커널에서 실제로 일어나고있는 일. 따라서 syscall 래퍼 valgrind는 syscall을 볼 때 호출하려고 시도합니다. 333은 함수 호출 서명이 아마도 일치하지 않기 때문에 syscall을 실제로 처리 할 수 ​​없습니다.

내가 생각하기에 preadv는 ...기본적으로

asmlinkage long my_ipc (uint, long, long, long, long, long); 
+0

단순히 테이블을 확장합니까? 그것은 엔트리를 오버라이드하고 valgrind가 시스템 콜을 만들 때 원하는 시스템이 아닐 수도 있습니다 (액세스가 나쁜 것처럼 보입니다). –

+0

추가 검토 후 엔트리가 무시됩니다. – sbrett

+0

그게 내가 생각한거야 : –

답변

3

당신이이 문제를 해결하려고하는 유일한 방법은와 충돌 시스템 호출에 대한 지원을 제거하기 위해 Valgrind의를 수정하는 것입니다 같은

preadv(int fd, const struct iovec *iov, int iovcnt, off_t offset); 

내가 무엇을 말할 수에서

, 내 IPC 호출이 보인다 사용자 정의 시스템 호출에 최소한의 지원을 추가하십시오. valgrind는 동일한 슬롯을 사용하는 표준 시스템 호출 인 것처럼 사용자 정의 시스템 호출에 대한 인수를 해석하려고합니다.

valgrind 소스 트리의 루트에있는 README_MISSING_SYSCALL_OR_IOCTL 파일은 valgrind에 시스템 호출 래퍼를 추가하는 방법을 시작하기에 가장 좋은 곳입니다.

valgrind 토론 포럼에 관한 질문에 답변을 얻으려면 mailing lists 또는 #valgrind IRC 채널이 있습니다.

+0

좋아, 그래서 밖으로 평평한 빌드 valgrind 빌드하고 내 특정 시스템 호출에 대한 지원을 삽입 응? 쉬운 방법이 없다고 생각해보십시오. 하나의 valgrind 빌드에 두 세트의 시스템 호출을 공존시킬 수있는 방법이 있다면 확신 할 수 없었지만 아마도 너무 어렵습니다. 나는 2 개의 분리 된 valgrind 실행 파일을 유지할 수 있다고 생각합니다. – sbrett

+0

시스템 호출은 순전히 번호로 식별되고 커널은 최신 업스트림 커널에 의해 추가 된 새 호출과 충돌하는 번호를 사용하는 사용자 정의 호출을 추가했기 때문에 이들은 공존 할 수 없습니다. 따라서 valgrind는 시스템 호출 333이 정상적으로 다른 것임을 알 수있는 방법이 없습니다. – TomH