2015-01-25 6 views
1

많은 멤버가있는 큰 구조체를 사용하는 기존 C 코드의 프로파일 링을 시도하고 있습니다. 더 작은 캐시 친화적 인 구조체로 리팩터링한다는 목표를 가지고 있습니다. 가장 자주 액세스되는 멤버 및 더 추운 데이터에 대한 포인터리눅스/C : 여러 변수에서 액세스를 추적하는 방법

몇 가지 유스 케이스에서 몇 시간 동안 앱을 모니터링하고 구조체 인스턴스의 각 멤버에 액세스 한 빈도에 대한 보고서를 작성하는 방법을 찾고 싶습니다.

x86 디버그 레지스터가 이상적이지만 불행히도 동시에 4 개의 주소 만 볼 수 있으며 더 많이 필요합니다.

일시적으로 각 구성원이 자신의 전체 페이지를 차지하도록하고 모든 페이지를 액세스 할 수 없도록 표시 한 다음 여하튼 전에 각 액세스를 기록하도록 segfault 처리기를 설정 할 수 있다고 생각했습니다 (이것이 까다로운 문제입니다) 앱을 복구하고 앱을 계속 허용합니다. 모니터링되는 메모리 중 어느 것도 시스템 콜에 전달되지 않으므로 읽을 수없는 인수로 인해 syscall에 문제가 발생하지 않습니다. 핸들러를 사용하여 일시적으로 페이지에 액세스 가능하게하고, 오류 지시를 수행하고, 페이지를 다시 보호 한 다음 반환하는 방법이 있습니까?

실패한 경우 많은 주소에 대한 액세스를 기록하는 더 합리적인 방법이 있습니까? valgrind에 뭔가가 있을까요? 감사합니다

나는 일시적으로 각 구성원은 자신의 전체 페이지를 점유 할 수있는 생각

답변

2

, 힙 - 할당 된 개체에 대한이 유일한 작품

, 그리고 무엇 Electric Fence 사용합니다. 과거에는 전기 울타리 오버 헤드가 너무 커서 장난감 프로그램 이외에는 사용할 수 없다는 것을 알았습니다.

이렇게하지 않으면 많은 주소에 대한 액세스를 기록하는 더 합리적인 방법이 있습니까? valgrind에 뭔가가 있을까요?

이것은 사용자 지정 Valgrind 도구를 작성하는 것만 가능하지만 복잡한 제안입니다.

더 나은 방법은 대신 Pin tool을 사용하는 것입니다.

+0

감사합니다. 핀이 멋지게 보입니다. 나는 언급 했어야한다, 나는 모든 객체가 할당 된 힙일 것이라는 것을 보장 할 수있다. 아마도 전기 펜스는 프로그램 데이터의 일부를 추적하지 않고 훨씬 더 많은 데이터를 추적하려고합니다. – gimmeamilk

+0

@gimmeamilk 아니요, efence는 더 많은 데이터를 추적하지 않습니다. 결국 모든 가드 페이지가 고유 한 페이지 세트에 들어가서 오버 헤드 가드 페이지가 생기게됩니다 (1 바이트 malloc의 경우 4096x 오버 헤드, 큰 할당의 경우, 실제 프로그램에서는 작은 할당이 많이 사용됩니다). –

+0

그건 내가 말한 것입니다. Electric Fence는 응용 프로그램이 모든 단일 malloc에 ​​대해 전체 페이지를 사용하는 반면 특정 구조체 집합의 할당 만 추적합니다. – gimmeamilk