런타임 중에 모든 변수를 메모리에 간단히 덤프 할 수있는 내장 또는 타사 라이브러리가 있습니까? 내가 원하는 것은 변수 &의 현재 값을 중단 점을 치고 변수 위로 마우스를 가져 가면서 볼 수 있지만 실제로 프로그램 실행을 중단하지 않고 (즉, 스냅 샷 만 가져 오는 것) 볼 수 있습니다. 나중에 프로그램에서 열 수있는 파일로 덤프 할 수 있다면 좋은 GUI 인터페이스를 사용하여 볼 수 있지만 간단한 텍스트 파일 덤프로 충분할 것입니다.C# 런타임 동안 모든 변수 및 현재 값을 덤프하는 방법
답변
나는 일반적인 방식으로 이것을 쉽게 할 수있는 방법을 생각할 수 없다. 작동 가능한 것은 프로그래밍 방식으로 실행중인 프로세스의 덤프 파일을 만드는 것입니다. dbghelp.dll 루틴으로 P/Invoke를 수행하거나 cdb.exe 프로세스를 생성하여 덤프 파일을 만들 수 있습니다. 파일을 받으면 나중에 분석을 위해 SOS.dll with cdb.exe/windbg.exe을 사용하여 디버거에서 열거 나 debugger script으로 작성하여 원하는 데이터를 자동으로 덤프 할 수도 있습니다.
나는 로깅 프레임 워크의 일종 당신이
... 그 체크 아웃 할 도움이 될 생각 : 내 직장에서
우리가 우리를 위해 꽤 잘 작동 log4net을 사용합니다.
그러면 나중에 분석을 위해 모든 변수를 버리고 싶습니까? 디버거에 대한 의존도를 줄이고 자동 테스트를 통해 값을 확인할 수 있도록 코드 테스트를 먼저 작성해 보셨습니까?
예. 이미 log4net과 유사한 로깅을 사용합니다. 그러나 일반 변수 덤프가 더 필요하여 모든 프로그램의 로거에 변수를 덤프하는 특정 코드를 작성할 필요가 없었습니다. 또한 복잡한 클래스 구조의 경우 읽기 쉽도록 스냅 샷의 GUI 뷰어를 갖는 것이 좋습니다. – mike
기본적으로 안심할 변수를 덤프하고 싶습니다. 나는 프로그램에 자신감을 가지고 있지만 모든 것이 잘되는 지 확인하고 싶습니다. 제가하고있는 일의 성격에 대한 철저한 테스트를 작성하는 것은 매우 어렵습니다. 그렇다면 생각할 수있는 상황에 대해서만 테스트를 작성할 수 있습니다. 또한 어떤 시점에서 프로그램이 어떤 상태에 있는지 알 수있는 낮은 수준의 방법으로 구성 할 수 있습니다. – mike
과거에는 .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를이 있다면 나는 놀라지 않을 것이다하지만 난 빠르게 자신의 웹 사이트에 명백한 문서를 찾을 수 없습니다 (그리고 난에 자신의 웹 세미나를보고 싶어하지 않았다 이 기능이 있는지 알아보십시오!)
YourKit에 비용이들 것이라고 언급해야합니다. WMemoryProfiler는 무료이며 오픈 소스입니다. Mykit을 제외하고 일상적인 프로파일 러의 웹 페이지에서도 프로그램 된 메모리 스냅 샷 Api가 없습니다. 나머지는 성능 프로파일 러 스냅 샷을위한 Apis 만 있습니다. 이 기능이 존재한다면 마케팅은 웹 페이지에 넣었을 것이라고 확신합니다. –
Intellitrace 도구는 Visual Studio의 궁극적 인 버전과 함께 제공됩니다. 그것은 당신이 설명하는 것입니다 - 그것은 당신의 앱에서 일어나고있는 일을 기록하고 변수와 다른 모든 디버그 창 위로 당신의 프로그램을 실행하지 않고 그것을 디버깅 할 수있게 해줍니다.
당신은 디스크에
- 에 WMemoryProfiler을 사용할 수 있습니다
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를 덤프 분석기로 사용하기 때문에 거대한 메모리 덤프가있을 때 속도가 매우 느립니다.
- 1. 런타임 동안 파일을로드하는 방법
- 2. 아이폰 3.0에서 런타임 동안 Plist 및 값을 어떻게 저장하나요?
- 3. 런타임 동안 플렉스 차트를 다시 그리는 방법
- 4. svn 데이터베이스를`덤프하는 '방법?
- 5. SOS가있는 Windbg, C# 구조체를 덤프하는 방법
- 6. .a 파일에서 기호를 덤프하는 방법
- 7. 런타임 동안 ActiveRecord의 테이블 이름을 변경하는 방법
- 8. C# 변수 값을 객체로 변환
- 9. 내가이 변수 배열 값을 다음 런타임 에서 C#에서 동적 배열을 만들 사용할 런타임
- 10. 실행하는 동안 linq 쿼리를 기반으로 전역 변수 값을 변경하는 방법
- 11. 런타임 동안 동일한 함수를 다시 실행하는 방법
- 12. 런타임 동안 플러그인 특정 구성이 해석되는 방법
- 13. 현재 정의 된 모든 변수 표시
- 14. C 구조체를 덤프하는 방법이 있습니까?
- 15. JTable 값을 선택하는 동안 모든 셀을 선택하는 방법?
- 16. 변수 값을 C#의 값을 반환하는 변수 이름으로 사용하기
- 17. Log4J - 런타임 변수 대체
- 18. WPF 모눈에서 UIElements의 모든 (X, Y) 위치를 덤프하는 방법
- 19. UISlider의 현재 값을 얻는 방법
- 20. 현재 스크롤 값을 설정하는 방법
- 21. 전체 POST 데이터를 ASP.NET의 파일에 덤프하는 방법
- 22. 모든 값을 표시하는 방법
- 23. HashSet을 Java로 파일로 덤프하는 방법
- 24. JS 배열을 덤프하는 방법 ... (boommarklet?)
- 25. StackTrace에서 매개 변수 값을 가져 오는 방법
- 26. 컴파일 타임 및 런타임 캐스팅 C#
- 27. 현재 및 상위 프레임의 변수 나열
- 28. C# PropertyGrid - 현재 값을 편집 중인지 확인하십시오.
- 29. 할-동안 별도의 변수
- 30. 런타임 동안 동적 레이아웃이 변경됨
나는이 질문이 매우 일반적이라고 생각하며 대답이 존재한다면 "수퍼 디버거"의 일부를 구성 할 것이므로 그 현상금을 공개했다. 변수 목록을 즉시 필터링 할 수 있고 메모리 사용량을 너무 많이 준다고 상상해보십시오. –
"자체 디버거"? –
아니요. 우리가 실제로 C#으로 가지고있는 것보다 우수하기 때문에 '슈퍼'를 의미하지 않습니다. –