2009-10-12 4 views
20

런타임 중에 모든 변수를 메모리에 간단히 덤프 할 수있는 내장 또는 타사 라이브러리가 있습니까? 내가 원하는 것은 변수 &의 현재 값을 중단 점을 치고 변수 위로 마우스를 가져 가면서 볼 수 있지만 실제로 프로그램 실행을 중단하지 않고 (즉, 스냅 샷 만 가져 오는 것) 볼 수 있습니다. 나중에 프로그램에서 열 수있는 파일로 덤프 할 수 있다면 좋은 GUI 인터페이스를 사용하여 볼 수 있지만 간단한 텍스트 파일 덤프로 충분할 것입니다.C# 런타임 동안 모든 변수 및 현재 값을 덤프하는 방법

+0

나는이 질문이 매우 일반적이라고 생각하며 대답이 존재한다면 "수퍼 디버거"의 일부를 구성 할 것이므로 그 현상금을 공개했다. 변수 목록을 즉시 필터링 할 수 있고 메모리 사용량을 너무 많이 준다고 상상해보십시오. –

+0

"자체 디버거"? –

+1

아니요. 우리가 실제로 C#으로 가지고있는 것보다 우수하기 때문에 '슈퍼'를 의미하지 않습니다. –

답변

7

나는 일반적인 방식으로 이것을 쉽게 할 수있는 방법을 생각할 수 없다. 작동 가능한 것은 프로그래밍 방식으로 실행중인 프로세스의 덤프 파일을 만드는 것입니다. dbghelp.dll 루틴으로 P/Invoke를 수행하거나 cdb.exe 프로세스를 생성하여 덤프 파일을 만들 수 있습니다. 파일을 받으면 나중에 분석을 위해 SOS.dll with cdb.exe/windbg.exe을 사용하여 디버거에서 열거 나 debugger script으로 작성하여 원하는 데이터를 자동으로 덤프 할 수도 있습니다.

4

나는 로깅 프레임 워크의 일종 당신이

... 그 체크 아웃 할 도움이 될 생각 : 내 직장에서

http://www.dotnetlogging.com/

우리가 우리를 위해 꽤 잘 작동 log4net을 사용합니다.

그러면 나중에 분석을 위해 모든 변수를 버리고 싶습니까? 디버거에 대한 의존도를 줄이고 자동 테스트를 통해 값을 확인할 수 있도록 코드 테스트를 먼저 작성해 보셨습니까?

+0

예. 이미 log4net과 유사한 로깅을 사용합니다. 그러나 일반 변수 덤프가 더 필요하여 모든 프로그램의 로거에 변수를 덤프하는 특정 코드를 작성할 필요가 없었습니다. 또한 복잡한 클래스 구조의 경우 읽기 쉽도록 스냅 샷의 GUI 뷰어를 갖는 것이 좋습니다. – mike

+0

기본적으로 안심할 변수를 덤프하고 싶습니다. 나는 프로그램에 자신감을 가지고 있지만 모든 것이 잘되는 지 확인하고 싶습니다. 제가하고있는 일의 성격에 대한 철저한 테스트를 작성하는 것은 매우 어렵습니다. 그렇다면 생각할 수있는 상황에 대해서만 테스트를 작성할 수 있습니다. 또한 어떤 시점에서 프로그램이 어떤 상태에 있는지 알 수있는 낮은 수준의 방법으로 구성 할 수 있습니다. – mike

1

과거에는 .Net 응용 프로그램을 프로파일 링하기 위해 YourKit .Net 프로파일 러를 사용했습니다.

Snapshot documentation에는 실행중인 응용 프로그램에 연결하는 데 사용한 적이 있지만 나중에 검토 할 수 있도록 프로그래밍 방식으로 스냅 샷을 덤프하는 데 사용할 수있는 Profiler API이 있다고 나와 있습니다.

코드는 현명이는 다음처럼 단순하게 보이는 :

Controller c = new Controller(); 
String snapshotPath = c.CaptureSnapshot(); 

난 당신이 다음을 검토하기 위해 추후에 YourKit GUI에 스냅 샷 파일을로드 할 수 있습니다 생각합니다.

JetBrains의 dotTrace Performance 및 RedGates ANTS Performance Profiler 같은 다른 인기있는 프로파일 중 일부는 유사한 프로그램 API를이 있다면 나는 놀라지 않을 것이다하지만 난 빠르게 자신의 웹 사이트에 명백한 문서를 찾을 수 없습니다 (그리고 난에 자신의 웹 세미나를보고 싶어하지 않았다 이 기능이 있는지 알아보십시오!)

+1

YourKit에 비용이들 것이라고 언급해야합니다. WMemoryProfiler는 무료이며 오픈 소스입니다. Mykit을 제외하고 일상적인 프로파일 러의 웹 페이지에서도 프로그램 된 메모리 스냅 샷 Api가 없습니다. 나머지는 성능 프로파일 러 스냅 샷을위한 Apis 만 있습니다. 이 기능이 존재한다면 마케팅은 웹 페이지에 넣었을 것이라고 확신합니다. –

0

Intellitrace 도구는 Visual Studio의 궁극적 인 버전과 함께 제공됩니다. 그것은 당신이 설명하는 것입니다 - 그것은 당신의 앱에서 일어나고있는 일을 기록하고 변수와 다른 모든 디버그 창 위로 당신의 프로그램을 실행하지 않고 그것을 디버깅 할 수있게 해줍니다.

0

PostSharp을 사용할 수 있습니다. 환경 응용 프로그램이 배포 되었기 때문에 디버그 시간을 기록하는 것이 매우 유용하다는 것을 알게되었습니다. 그리고 많은 것들을 계측/기록했습니다.

하지만 분명히 기록해야하는 모든 변수를 지정해야합니다.

자세한 내용 확인 here.이를 위해

1

당신은 디스크에

  • 직렬화 특정 개체를 자신의 프로세스의 메모리 덤프를 만들기 객체 배열
  • 모든 응용 프로그램 도메인에있는 모든 개체를 가져옵니다

    Windbg가 필요하지만 WMemoryProfiler의 API는 완벽하게 관리되며 기본적으로 프로세스를 디버그 할 수 있습니다. 라이브러리는 멋진 접근 가능한 라이브러리에서 Windbg을 감싸기 때문에 일반적인 디버거를 처리합니다.

    아래 코드는 System.Threading.Thread 개체의 모든 인스턴스를 개체 배열로 가져옵니다. 이렇게하면 런타임에 자신의 응용 프로그램 객체에 대한 비주얼 라이저를 작성할 수 있습니다. 다른 오버로드는 모든 AppDomains의 모든 개체를 제공합니다.

    using (var debugger = new MdbEng()) 
    { 
        var dummy = new Thread(() => {}); 
        dummy.Name = "Dummy Thread"; 
    
        // Get all thread objects in all AppDomains 
        var threads = debugger.GetObjects("System.Threading.Thread", true); 
    
        foreach (Thread t in threads) 
        { 
        Console.WriteLine("Managed thread {0} has Name {1}", t.ManagedThreadId, t.Name); 
        } 
        GC.KeepAlive(dummy); 
    } 
    

    당신은 또한 즉석에서 메모리 덤프를 생성하고 나중에 덤프에서 시각화를 위해 객체 데이터를 추출하는 프로세스에서 메모리 덤프를로드 할 수 있습니다 Windbg에서 래퍼이기 때문에. Commiteical Memory Profilers (예 : Scitech의 MemoryProfiler)는 수년 이래이 기술을 사용하지만 Windbg를 덤프 분석기로 사용하기 때문에 거대한 메모리 덤프가있을 때 속도가 매우 느립니다.

  • 관련 문제