2016-07-17 12 views
0

저는 C++ 프로그램의 성능을 향상시키기 위해 노력하고 있으며 메모리 할당 (mallocs)을 객체 풀로 변환하면 큰 효과를 얻고 있습니다. 코드베이스가 상당히 크기 때문에 malloc이 호출 된 장소를 감지하는 것이 문제입니다. 많은 타이머와 시그널 핸들러가 병렬로 실행되기 때문에 브레이크 포인트가있는 간단한 gdb를 사용할 수 없습니다.C++이 메모리 할당을 감지합니다.

gdb에서 malloc을 호출 할 때마다 매번 수동으로 수행하지 않고 전체 스택 추적을 인쇄 할 수있는 방법이 있습니까? 또는 동일한 작업을 수행하는 데 도움이되는 다른 도구를 제안 해 줄 수 있습니까?

+4

전체 코드베이스에서 문자열'malloc '을 검색하는 것이 얼마나 어렵습니까? – taskinoor

+0

왜 C++ 코드에서 malloc을 사용하고 있습니까? 새로운 것을 사용해야합니다. 어떤 경우에는 자신 만의 새로운 연산자를 정의 할 수 있습니다. –

+0

GDB에서 [* this *] (http://stackoverflow.com/a/378024/23771) 할 수 있습니까? * malloc * (또는 * new *)에 도착하면 살아있는 것을 발견했습니다. 그렇지 않은 경우, 20 개 정도의 샘플을 채운 후에는 너무 적은 시간 만 사용하여 최적화하면 실제로 가치가 없습니다. –

답변

1

파이썬을 사용하여 gdb를 스크립트 할 수 있습니다.

자신 만의 malloc 함수를 구현하여 링크 할 수도 있습니다. 반송 주소가 스택에 표시되어 발신자에게 표시됩니다.

valgrind --tool=massif ./mybinary 

이 프로그램이 실행이 완료된 후 검사 할 수 있습니다 스택 추적을 포함한 모든 할당의 세부 사항을 수집합니다

0

도구의 Valgrind의 제품군은 바로이 목적을 위해 사용할 수있는 대산 괴가 포함되어 있습니다. 출력에 대한 자세한 내용은 대용량 문서 (http://valgrind.org/docs/manual/ms-manual.html)를 참조하십시오. 희망이 도움이됩니다.

P. 또한 TCMalloc 라이브러리를 점검하십시오. 이미 특정 응용 프로그램에 따라 더 잘 수행 할 수 있지만 이미 원하는대로 수행 할 수 있습니다. 가장 좋은 점은 소스 코드를 변경하지 않아도된다는 것입니다. 단순히 링커 지시어를 사용하여 glibc의 malloc 함수를 대체하십시오.