2015-01-23 2 views
3

!DumpHeap 명령의 출력을 취하는 WinDbg 명령 줄 식을 찾고 각 주소에 대해 0x08의 오프셋에서 64 비트 값을 읽습니다. 주소. 나는 이것이 가능하다고 생각한다. 그러나 지금까지 시도한 모든 시도는 약간의 오류로 실패한다.! DumpHeap 출력을 반복하여 메모리 오프셋에서 값을 읽습니다.

많은 검색을했지만 대부분의 WinDbg 기사는 시도 할 수있는 간단한 예제를 보여 주지만 시도는 실패합니다.

ASP.NET 작업자 프로세스의 프로세스 덤프가 있습니다. 프로세스는 메모리가 약간 증가하지만 명확한 범죄자는 없으므로 여러 번 메모리에 나타나는 많은 개체를 나열하려고합니다. 관리되는 디버깅 WinDbg 확장에 sos.dll을 사용하고 있습니다.

가 여기에 내가 위의 명령은 한 줄에 있어야한다는,

.foreach(myaddress {!dumpheap -short -mt 000007fe998adea8}) 
{r @$t0=poi(myaddress+0x8);!do @$t0;.echo ************* myaddress} 

주의 할 노력하고있어 무엇 - 나는 단지 여기에 가독성에 대한 줄 바꿈을 추가했습니다.

위의 줄에서 WinDbg는 Couldn't resolve error at 'myaddress+0x8);!do @$t0;.echo ************* 00000001003cb870'이라는 오류를 인쇄합니다.

!DumpHeap에 의해 반환 된 모든 주소를 반복하려고합니다. 각 주소는 myaddress 변수에 들어가야합니다. 그런 다음 각 주소에 대해 myaddress+0x8에서 읽은 값으로 $t0 사용자 레지스터를 설정하려고합니다. !do (!DumpObject) 명령은 그 주소에서 오브젝트를 덤프합니다.

나는 (WinDbg는에서 한 행에, 다시) 만 실행하는 경우 :

.foreach(myaddress {!dumpheap -short -mt 000007fe998adea8}) 
{!do myaddress;.echo ************* myaddress} 

내가 오브젝트 덤프의 목록을 얻을 그러나 이것은 내가 필요한 것보다 한 단계 높은 수준이다. 한 단계 아래로 드릴 다운하고 반복하는 특정 수준의 개체 중 특정 멤버를 덤프하고 싶습니다.

이것이 가능할까요? 아니면 내가 잘못된 길을 가고 있습니까?

+0

가능한 중복 공간이 필요합니다 [ SOS (또는 SOSEX)를 사용하여 WinDbg의 필드 중 하나에 특정 값으로 관리되는 개체를 표시하는 방법?] (http://stackoverflow.com/questions/20765713/how-to-display-managed-objects-with-certain- 가치있는 하나의 필드에서 윈드 백) –

+0

@ ᵺṓᵯ ᵴ 네, 중복 될 수 있습니다. – xxbbcc

답변

4

추가 검색 후에 잘못된 구문을 사용하고있는 것으로 나타났습니다. questionMSDN에 따르면 변수 이름은 공백으로 묶어야하며 작동하려면 으로 묶어야합니다. ${} 인클로저를 사용한 후 스크립트가 작동하기 시작했습니다. 나중에 참조 할 수 있도록

, 여기 (WinDbg는에 한 줄에 계속) 스크립트를 실행하는 방법은 다음과 같습니다

.foreach(myaddress {!dumpheap -short -mt 000007fe998adea8}) 
{r @$t0=poi(${myaddress}+0x8);!do @$t0;.echo ************* myaddress} 
1

이 예는 별칭 주위의

.foreach (place { .shell -ci "!DumpHeap -stat" sed 1,3d | awk "{print $1 }" }) { .foreach (plays { !DumpHeap -short -mt place }) { r $t0 = poi(plays + 8) ; !do @$t0 ; .echo ========================================= } }

관련 문제