우선, 내가 잘못된 장소에 이것을 쓰고 있으면 사과하겠습니다. 나는이 성격의 물건을 게시하는 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);
단순히 테이블을 확장합니까? 그것은 엔트리를 오버라이드하고 valgrind가 시스템 콜을 만들 때 원하는 시스템이 아닐 수도 있습니다 (액세스가 나쁜 것처럼 보입니다). –
추가 검토 후 엔트리가 무시됩니다. – sbrett
그게 내가 생각한거야 : –