2016-12-27 6 views
0

у меня есть простое консольное приложение (целевая рамочное 4.5.2):Не удалось найти во время выполнения clr.dll использовать СОС

using System; 

public class SosTest 
{ 
    public class Foo 
    { 
     public Foo() 
     { 
      Console.WriteLine("Creation of foo"); 
     } 
    } 

    static void Main(string[] args) 
    { 
     var n1 = new Foo(); 
     var n2 = new Foo(); 
     Console.WriteLine("Allocated objects"); 
     Console.WriteLine("Press any key to invoke GC"); 
     Console.ReadKey(); 
     n2 = n1; 
     n1 = null; 
     GC.Collect(); 
     Console.WriteLine("Press any key to exit"); 
     Console.ReadKey(); 
    } 
} 

Я хочу видеть состояние управляемой кучи. Я делаю следующие шаги:

  1. Открыть Windbg
  2. Открыть исполняемый файл из моей программы с помощью команды Windbg «Открыть исполняемую»
  3. Perform команды для загрузки СОСА .load MicrosoftNet\Framework\v4.0.30319\sos.dll
  4. Perform команды, чтобы увидеть состояние кучи !eeheap -gc

Но во время последней команды я получаю следующее сообщение:

Не удалось найти исполняемый файл DLL (clr.dll), 0x80004005 Для команд расширения требуется clr.dll, чтобы иметь что-то делать.

Почему команда !eeheap -gc не работает?

Если это поможет это является результатом lm команды:

0:000> lm 
start end  module name 
00be0000 00be8000 ConsoleApplication1 (deferred)    
734c0000 73519000 MSCOREE (deferred)    
74c20000 74d00000 KERNEL32 (deferred)    
753d0000 75571000 KERNELBASE (deferred)    
77d80000 77f03000 ntdll  (pdb symbols) 

ответ

4

Я не уверен, что вы делаете это правильный путь или нет, но я использовал, чтобы сделать это с помощью следующей команды:

sxe ld clrjit; g 

и после этого пишут:

.loadby sos clr 

sxe ld clrjit уведомляет отладчик, когда модуль clrjit загружен, g флаг для продолжения выполнения и .loadby sos clr загрузит СОС отладчик от места, где он находит clr.dll

Однажды я наблюдал следующее следующие два plural- смотровые курсы по C# внутрикорпусных по Bart de Smet и я нашел их отлично подходит для понимания идеи о C# и CLR:

C# Language Internals - Part 1

C# Language Internals - Part 2

+0

Команда '.loadby' нуждается в модуле' clr' для работы. Обычно это загружается раньше, чем 'clrjit', поэтому' sxe ld clr' может быть достаточно. –