*nix 시스템의 대규모 C/C++ 코드에서 메모리 관련 문제를 추적/수정하는 방법

*nix 시스템의 대규모 C/C++ 코드에서 메모리 관련 문제를 추적/수정하는 방법

메모리 관련 문제를 추적할 때 어떤 전략을 사용합니까? 메모리 누수, 메모리 손상 등을 식별하기 위해 어떤 도구(오픈 소스 및 독점)를 사용합니까? 시스템에서 gdb/dbx만 사용할 수 있는 경우 메모리 누수를 어떻게 추적합니까?

디버거만 사용하여 메모리 누수를 수정하는 것은 매우 어렵습니다.

답변1

소스코드 수정이 가능한 경우동적 할당훌륭합니다. 해제되지 않은 포인터와 해당 포인터가 할당된 행(디버그 기호로 빌드된 코드의 경우)을 나열합니다.

당신이 할 수 없다면,월그린드거의 이런 종류의 표준입니다. 일반적으로 Valgrind는 사용하기가 조금 더 어렵다고 생각하지만 더 많은 기능을 갖추고 있으며 코드에 dmalloc 호출을 추가하지 않습니다.

답변2

valgrind는 매우 도움이 됩니다.

답변3

구성(valgrind에서)는 메모리 누수를 찾는 가장 좋은 방법 중 하나입니다. 의심스러운 코드를 반복하거나(또는 충분히 오랫동안 프로그램을 실행하고) ms_print를 사용하여 결과를 덤프하십시오. 일반적으로 호출 스택은 문제를 해결하는 데 충분한 정보를 제공합니다.

GDB를 사용하면 실행 중인 프로그램에 연결하고 다음과 같은 것을 호출할 수 있습니다.malloc_stats()

프로그램이 다른 언어로 작성되면 더 까다로울 수 있습니다. 최근 일부 GDB는 스크립트 기능을 얻었고 사람들은 다음과 같은 흥미로운 프로젝트를 시작했습니다.GDB 힙, 코어 덤프에서 Python 메모리를 분석합니다. C++ 객체에 대해서도 유사한 메모리 분석 스크립트를 사용할 수 있습니다.

또한 읽어보세요https://stackoverflow.com/questions/2564752/examining-cc-heap-memory-statistics-in-gdb

답변4

나는 한동안 Objective-C를 사용해 왔으며 C 수준 메모리 관리와 같은 작업을 처리하는 프로파일러를 가지고 있습니다.Clang 정적 분석기너무 좋아서 Apple은 이를 xCode IDE와 함께 번들로 제공하기로 결정했습니다. 이것이 귀하의 문제에 적합한지는 잘 모르겠지만 C를 사용하고 있다면 시도해 볼 가치가 있습니다.

관련 정보