Obtenir l'Adresse Mémoire de l' .NET Objet (C#)

Je suis en train de traquer un bug dans le mono d'exécution lorsqu'une variable semble être attribuée à un objet valide, puis attribué plus tard à un faux objet, plus précisément

//early in code I allocate, fine
var o = new object(); //valid allocation
//later in code this is called, not fine
lock(o) //<- is triggering bug due to "o" now referencing a nonsense memory location.

Je voudrais savoir quand la référence à "o" devient non-sens, et pour ce faire je suis à la recherche d'un moyen de déterminer l'adresse de "o" à divers intervalles dans le code C#. Je sais, c'est similaire à d'autres questions avec des réponses "ne fais pas ça il y a une table", mais le GC ne fonctionne pas donc j'ai besoin d'une solution de contournement.

Personne ne sait comment je peux déterminer l'adresse d'un mono objet en C#? Suis bien le lien dans le code non managé ou quoi que ce soit. (Toutes les autres indices moyens de diagnostiquer le problème principal apprécié pour).

  • Quel est le message d'erreur exact? Est-il à propos de l'éliminer plutôt que "d'être non-sens"?
  • Au lieu de verrouillage sur un object, pourriez-vous créer une classe jetables avec un finaliseur-mais pas de ressources réelles -- puis la verrouiller, et de définir les pauses dans le débogueur quand il est finalisé?
  • L'erreur complet est décrit ici, et qui se passe en aval: bugzilla.xamarin.com/show_bug.cgi?id=21939 Fondamentalement, le GC traite une mauvaise référence comme un objet, conduisant à un sigsegv
  • Est-ce que tout dans la même méthode?
  • malheureusement, le code est dans la classe runtime des bibliothèques (en particulier Paresseux.cs), donc je suis en train de corriger le bogue, plutôt que de changer le bon C#
  • l'objet de l'allocation est dans le constructeur, le verrou est pris, plus en aval dans une méthode. Lignes 87 et 150 dans ce fichier (github.com/mono/mono/blob/master/mcs/class/corlib/System/...)
  • C'est un undebuggable problème, l'adresse d'un objet change constamment, tandis que le GC compacte le tas. Vous avez besoin de poursuivre le type de bug, vous pouvez le fixer et à supposer que cela est causé par la corruption de segment. Le genre produit par débordement de mémoire tampon dans le code non managé.
  • plus difficile bug que j'ai vu jusqu'à présent et semble certainement en raison d'une corruption de mémoire. Si l'adresse change à chaque GC, il semble que lorsque la modification de la mauvaise valeur, il est toujours affecté à l'exact même mauvais (et faux) de la valeur, je suis donc vérifier si c'est le cas. Mon espoir était de restreindre l'intervalle lorsque la corruption se produit en le faisant. Si vous savez de quoi que ce soit d'autre qui est utile pour le débogage mem corruption, serait heureux de l'entendre.