2012-10-22 3 views
3

Je vais avoir du mal à comprendre comment se rendre à l'adresse d'un membre statique de classe .NET à l'aide WinDBG w/SOS. Compte tenu d'un programme d'entrée comme celui-ci:Trouver l'adresse du champ statique dans WinDbg w/SOS

namespace windg_static_test 
{ 
    class StaticTest 
    { 
     public static bool static_bool_field = true; 
     public void show_and_set() 
     { 
      while (static_bool_field) 
      { 
       Console.WriteLine("static_bool_field = " + static_bool_field + "\nEnter new value: "); 
       static_bool_field = Console.ReadLine()[0] == '0' ? false : true; 
      } 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      StaticTest st = new StaticTest(); 
      st.show_and_set(); 
     } 
    } 
} 

je peux trouver le EEClass en utilisant name2ee, et je peux voir les valeurs à l'aide dumpclass w/la valeur name2ee!.

0:004> !dumpclass 1c12e0 
Class Name:  windg_static_test.StaticTest 
mdToken:   02000002 
File:   C:\Develop\Projects\windg static test\bin\Release\windg static test.exe 
Parent Class: 64f84920 
Module:   001c2e94 
Method Table: 001c3844 
Vtable Slots: 4 
Total Method Slots: 6 
Class Attributes: 100000 
Transparency:  Critical 
NumInstanceFields: 0 
NumStaticFields:  1 
     MT Field Offset     Type VT  Attr Value Name 
65377208 4000001  1f  System.Boolean 1 static  1 static_bool_field 

Mais je ne peux pas sembler comprendre comment obtenir l'adresse que la valeur est stocké à. Comment cela est-il fait, en général?

Merci, Eglin

+0

Quelle version de .NET sont le débogage? –

+0

Oh, ça alors! Je suis désolé - j'ai essayé si fort de faire une question complète, et échoué gravement. J'utilise 4.5 sur Win 7 x64, en compilant "Any CPU", et en utilisant la version 32 bits de WinDbg. – Eglin

Répondre

0

farfouillé le démontage m'a permis de voir les valeurs statiques étant repris du segment .data. Je n'ai pas réussi à trouver une solution universelle pour obtenir l'emplacement correct à partir du décalage que! Dumpclass /! Dumpobj vous donne pour les types de valeur, mais les index fonctionnent bien pour les membres de type référence statique sur le tassez une fois que vous avez trouvé le pointeur de base. Je suppose que je devrais fouiller dans les détails du format PE pour obtenir de meilleures informations sur la façon dont les informations sont stockées dans les segments .data, bien que je ne sache pas exactement par où commencer ou si cela vaut la peine de poursuivre à ce stade .

Merci pour l'aide, tout le monde.

5

SOS ne pas afficher l'adresse du champ. Utilisez! Sosex.mdt à la place. ! Sosex.mdt windbg_static_test.StaticTest.

+0

Je suis sûr que votre extension est merveilleuse, mais je préférerais de beaucoup une réponse telle que, "regarder offset 7c de l'eeclass" si une telle chose existe. Comment trouvez-vous l'adresse dans votre extension WinDBG? – Eglin

+4

C'est beaucoup plus complexe que ça et c'est différent pour chaque version majeure de l'exécution. Les statistiques sont stockées dans des tableaux par domaine ou par thread. Il y a un emplacement en mémoire qui donne l'adresse du début de la statique pour le domaine/thread puis un offset stocké dans la classe. C'est une information non documentée, et puisque je travaille pour MS maintenant, je ne peux pas le documenter ici. –

+1

De plus, cela dépend si une classe est partagée ou non et si c'est une classe dynamique. Il me faudrait une révision considérable du code pour me souvenir même des algorithmes. –

1

SOS affiche l'adresse que si elle est un objet de type de référence. Pour int, bool il montre directement la valeur car ils sont le type valeur