2015-11-26 3 views
2

Моя логическая переменная может ссылаться используя синтаксисКак изменить значение управляемой переменной?

MPrime.exe Spirit.MPrimeComServerManager._isComServerReady 

Я попытался с помощью синтаксиса

?? MPrime.exe Spirit.MPrimeComServerManager._isComServerReady=1 

, и я не знаю, как использовать e* команды с управляемым кодом.

Это выход из !DumpObj:

00007fff81a6d6e8 4000198 169 System.Boolean 1 static 0 _isComServerReady 

ответ

3

Давайте напишем этот пример программы, чтобы увидеть, как Булевы работать в .NET и как изменить значение с WinDbg:

using System; 

namespace ChangeValueOfBoolean 
{ 
    class Program 
    { 
     static void Main() 
     { 
      var h = new BooleanHolder(); 
      h.BoolValue = true; 
      Console.WriteLine("Debug now. Boolean member has the value {0}", h.BoolValue); 
      Console.ReadLine(); 
      Console.WriteLine("After debugging, boolean member has the value {0}", h.BoolValue); 
      h.BoolValue = true; 
      Console.ReadLine(); 
     } 
    } 

    class BooleanHolder 
    { 
     public bool BoolValue { get; set; } 
    } 
} 

Шаги для отладки :

  1. Скомпилировать его в режиме отладки
  2. Запустите приложение.
  3. присоединять WinDbg
  4. исправить символы .symfix;.reload
  5. загрузить расширение .NET .loadby sos clr
  6. найти соответствующий объект !dumpheap -short -type BooleanHolder
  7. дампа объекта !do <address>
  8. дамп необработанного значения в памяти dd <address>+<offset> L1

    Мы увидим, что true == 1

  9. редактировать исходное значение ed <address>+<offset> 0
  10. продолжить программу g
  11. Смотрите вывод на консоли
  12. Нажмите Enter

    Он перешел на false

Полное прохождение игры в WinDbg:

0:004> .symfix;.reload 
Reloading current modules 
.......................... 
0:004> .loadby sos clr 
0:004> !dumpheap -short -type BooleanHolder 
025330c8 
0:004> !do 025330c8 
Name:  ChangeValueOfBoolean.BooleanHolder 
MethodTable: 00144d74 
EEClass:  00141804 
Size:  12(0xc) bytes 
File:  E:\Projekte\SVN\HelloWorlds\ChangeValueOfBoolean\bin\Debug\ChangeValueOfBoolean.exe 
Fields: 
     MT Field Offset     Type VT  Attr Value Name 
704bf3d8 4000001  4  System.Boolean 1 instance  1 <BoolValue>k__BackingField 
0:004> dd 025330c8+4 L1 
025330cc 00000001 
0:004> ed 025330c8+4 0 
0:004> g 

enter image description here

+0

хорошо бы прохождение игры было бы здорово, если бы вы могли бы показать, как изменить с C++/C#? выражение как ?? Foo :: booleanxxx :: BOOL; ed foo: boolean :: xxx вместо ed @@ masm (address) anyway upvoted – blabb

+0

@blabb: Хм, я так и не сделал этого. Должно быть возможно? Я попробую –

+0

cdb -g booldoll.exe 1 <----- (a4.bac): исключение Control-C - код 40010005 (первый шанс) 0: 001> ?? booldoll! foo bool true 0: 001> ed booldoll! foo 0 0: 001> ?? booldoll! foo bool false 0: 001> g 0 <-------------- тип booldoll.cpp #include bool foo = true; int main (void) { char temp [10]; printf ("% x \ n", foo); gets_s (temp, sizeof (temp)); printf ("% x \ n", foo); gets_s (temp, sizeof (temp)); } – blabb

Смежные вопросы