2011-12-11 2 views
1

파일에서 텍스트를 읽고 네트워크를 통해 보내는 간단한 C++ 서비스가 있습니다. 시간이 지남에 따라이 서비스의 메모리 사용량은 고객 사이트에서 증가합니다. QA 테스트에서 그러한 행동은 관찰되지 않습니다.WinDbg를 사용하여 메모리 개체에 인쇄

주어진 시간에 메모리에있는 모든 String Object를 추출 할 수 있는지 알고 싶습니다.

고객이 다른 시간에 덤프를 가져올 때마다이 프로세스를 자동화하여 매번 메모리 크기 또는 내용을 찾아 결과를 비교할 수 있습니까?

답변

1

메모리 누수가있는 것 같습니다. 난 단지 관리 응용 프로그램을 디버깅하는 데 windbg를 사용합니다. 어쩌면이 Link가 도움이 될지도 모릅니다.

+0

예, 고객 환경에서만 발생하는 누출 인 것처럼 보입니다. 유용한 정보가있는 링크 주셔서 감사합니다. – Geek

3

C++의 경우 대답은 아니오입니다 (C#은 다른 이야기입니다). C++ 세계에서 누수가 의심되는 경우 "누출"이 발생하기 전에 usermode 스택 추적 (gflags.exe의 + ust)을 프로세스에서 활성화 할 수 있습니다. 누수가 발생한 후에 프로세스의 덤프를 가져 와서 검사하십시오. 이것을 조사하기 위해 (이 응답에서 네이티브 윈도우 힙을 사용한다고 가정했다.) 힙 구조를 통해 할당이 어디에 있는지 알아 내고 스택 백 트레이스를 조사하여 가장 일반적인 할당 크기를 샘플링한다. .

예.

  1. 앱을 실행하기 전에 gflags/i MyApp.exe + ust를 실행하십시오. 이것은 OS에게 프로세스를 처리하는 방법에 대한 특별한 지침을 제공하는 regkey를 설정합니다.
  2. 프로그램을 실행하고 "나쁜 행동"이 발생합니다.
  3. 나쁜 행동이 쉬운 동안 프로세스의 덤프를 수집하십시오 볼 Windbg에서
  4. ! 힙 - 개요에
  5. 열기 덤프와 첫 번째 colomn은 라지 가상 바이트 수
  6. 와 힙을 찾을 수 있습니다 (쉽게가 볼 수있다, 쉽게 그것은 찾을 수있을 것입니다) 너의 힙 핸들. 이전 단계에서 찾은 항목의 힙 핸들을 사용하고! heap -stat -h -grp를 실행하십시오. 그러면 주어진 힙에서 가장 많은 공간을 사용하는 힙 할당이 나열됩니다.
  7. 그래서 우리는 어느 힙이 크고, 가장 일반적인 항목의 크기를 알 수 있습니다. 몇 가지 주소가 필요하므로 할당 된 호출 스택을 살펴볼 수 있습니다. 실행! heap -flt s.
  8. 마지막 단계 (우리는 닫습니다). 실행! heap -p -a. 이 할당을 생성 한 codepath에 대한 스택 백 트레이스를 갖게됩니다. 이제 코드로 돌아가서 왜 이것이 해제되지 않는지 알 수 있습니다.
1

http://msdn.microsoft.com/en-us/library/ff558947(v=vs.85).aspx이 원하는대로 할 수 있습니다.

+1

UMDH는 + ust로 만든 데이터를 사용합니다. 단점은 대상 컴퓨터에 심볼을 설정해야한다는 것입니다. 이것이 제가 덤프를 잡아 내 도구 기계로 옮겨서 그곳의 데이터를 보는 주된 이유입니다. – JasonE

+0

그건 까다로운 부분 중 하나입니다. 예를 들어 ETL에도 똑같은 내용이 적용됩니다. 대상 컴퓨터의 바이너리를 복사하여 일치 시키면 UMDH가 체크섬 정보를 기록하지 않습니다. –

관련 문제