SORU
4 AĞUSTOS 2011, PERŞEMBE


Senin yapma .NET dil ayıklayıcı doğru adım

Öncelikle, ben bu sorunun uzunluğu için özür dilerim.

IronScheme yazarı değilim. Son zamanlarda, ben, o kadar da zor yayan iyi hata ayıklama bilgisi üzerine çalışıyorum 'yerli' .NET hata ayıklayıcı.

Bu kısmen başarılı olsa da, bazı sorunlar haline çalıştırıyorum.

İlk adım sorunu ile ilgilidir.

Düzeni ifade bir dil olduğu için, her şey büyük aksine parantez sarılmış olma eğilimindedir .Deyim gibi NET dilleri (veya hattı) tabanlı.

Orijinal kodu (Düzeni) gibi görünüyor:

(define (baz x)
  (cond
    [(null? x) 
      x]
    [(pair? x) 
      (car x)]
    [else
      (assertion-violation #f "nooo" x)]))

Kasıtlı bir yeni satır, her bir ifade hazırladım.

Verilmiş kod C dönüşümleri# (İLSpy) gibi görünüyor:

public static object ::baz(object x)
{
  if (x == null)
  {
    return x;
  }
  if (x is Cons)
  {
    return Builtins.Car(x);
  }
  return #.ironscheme.exceptions::assertion-violation (
     RuntimeHelpers.False, "nooo", Builtins.List(x));
}

Gördüğünüz gibi oldukça basit.

Not: Eğer kodu koşullu bir ifade dönüşmeye başlarsa (?:) C#, her şey sadece bir hata ayıklama adım olacaktır, bunu sakın unutmayın.

Burada kaynak ve satır numaraları ile IL çıktısı:

  .method public static object  '::baz'(object x) cil managed
  {
    // Code size       56 (0x38)
    .maxstack  6
    .line 15,15 : 1,2 ''
//000014: 
//000015: (define (baz x)
    IL_0000:  nop
    .line 17,17 : 6,15 ''
//000016:   (cond
//000017:     [(null? x) 
    IL_0001:  ldarg.0
    IL_0002:  brtrue     IL_0009

    .line 18,18 : 7,8 ''
//000018:       x]
    IL_0007:  ldarg.0
    IL_0008:  ret

    .line 19,19 : 6,15 ''
//000019:     [(pair? x) 
    .line 19,19 : 6,15 ''
    IL_0009:  ldarg.0
    IL_000a:  isinst [IronScheme]IronScheme.Runtime.Cons
    IL_000f:  ldnull
    IL_0010:  cgt.un
    IL_0012:  brfalse    IL_0020

    IL_0017:  ldarg.0
    .line 20,20 : 7,14 ''
//000020:       (car x)]
    IL_0018:  tail.
    IL_001a:  call object [IronScheme]IronScheme.Runtime.Builtins::Car(object)
    IL_001f:  ret

    IL_0020:  ldsfld object 
         [Microsoft.Scripting]Microsoft.Scripting.RuntimeHelpers::False
    IL_0025:  ldstr      "nooo"
    IL_002a:  ldarg.0
    IL_002b:  call object [IronScheme]IronScheme.Runtime.Builtins::List(object)
    .line 22,22 : 7,40 ''
//000021:     [else
//000022:       (assertion-violation #f "nooo" x)]))
    IL_0030:  tail.
    IL_0032:  call object [ironscheme.boot]#::
       'ironscheme.exceptions::assertion-violation '(object,object,object)
    IL_0037:  ret
  } // end of method 'eval-core(033)'::'::baz'

Not:Sadece tüm yöntem vurgulayarak hata önlemek için yöntem giriş noktası sadece 1 sütun genişliğinde olun.

Gördüğünüz gibi, her ifadesi doğru bir çizgi için haritalar.

Şimdi atlama sorunu (VS2010, VS2008 ama aynı/benzer konuda test):

Bu IgnoreSymbolStoreSequencePoints uygulanmış.

  1. Boş arg ile baz Ara, düzgün çalışır. (boş? x) x izledi.
  2. Eksileri ile baz arg Ara, düzgün çalışır. (boş? x) (pair? x) (car x).
  3. Diğer arg ile baz Ara, başarısız olur. (boş? x) (pair? x) (car x) (onaylama-ihlali ...).

IgnoreSymbolStoreSequencePoints (önerilen) uygularken:

  1. Boş arg ile baz Ara, düzgün çalışır. (boş? x) x izledi.
  2. Eksileri ile baz arg Ara, başarısız olur. (boş? x) (pair? x).
  3. Diğer arg ile baz Ara, başarısız olur. (boş? x) (pair? x) (car x) (onaylama-ihlali ...).

Ben de bazı çizgiler (burada gösterilmemiştir) yanlış vurgulanan bu modda, 1 kapalı bulmak.

İşte nedenleri ne olabilir bazı fikirler:

  • Tailcalls hata karıştırır
  • Yerleri (burada gösterilmemiştir) üst üste karıştırır debugger (kesme ayarı çok çok iyi yapar)
  • ????

İkinci olarak, ama aynı zamanda ciddi, sorunu, hata bazı durumlarda/hit noktalarını kırmak için başarısız oluyor.

Hata ayıklayıcı doğru kırmak için alabileceğim tek yer (ve sürekli övüldüğü), yöntem, giriş noktasında.

Durum IgnoreSymbolStoreSequencePoints uygulandığında biraz daha iyi olur.

Sonuç

VS debugger düz adamcağız sadece şu olabilir :(

Referanslar:

  1. Making a CLR/.NET Language Debuggable

Güncelleme 1:

Mdbg 64-bit derlemeler için çalışmıyor. Bu yüzden. Artık 32-bit üzerinde test etmek için makineleri var.Güncelleme:Bu büyük bir sorun olduğuna eminim, herkes bir düzeltme var mı?Düzenleme:Evet, aptalım, sadece 64 komutası altında mdbg sor :)

Güncelleme 2:

Bir C# uygulaması oluşturduk, ve hat bilgileri incelemek için çalıştı.

Benim bulgular:

  • Bir sıra noktası olması gerekir brXXX herhangi bir talimat sonra (eğer geçerli aka '#line hidden', nop uyarı).
  • brXXX herhangi bir talimat, uyarı '#' ve nop. gizli bir hat önce

Bu uygulama, ancak sorunlar (yalnız?) düzeltmez.

Aşağıdaki ekleme ama, istenen sonucu verir :)

  • ret, uyarı sonra '#line hidden' ve nop.

Bu IgnoreSymbolStoreSequencePoints uygulanmadığı modunu kullanarak. Uygulandığında, bazı adımlar hala atlanır :(

İşte yukarıda uygulandığında IL çıktısı:

  .method public static object  '::baz'(object x) cil managed
  {
    // Code size       63 (0x3f)
    .maxstack  6
    .line 15,15 : 1,2 ''
    IL_0000:  nop
    .line 17,17 : 6,15 ''
    IL_0001:  ldarg.0
    .line 16707566,16707566 : 0,0 ''
    IL_0002:  nop
    IL_0003:  brtrue     IL_000c

    .line 16707566,16707566 : 0,0 ''
    IL_0008:  nop
    .line 18,18 : 7,8 ''
    IL_0009:  ldarg.0
    IL_000a:  ret

    .line 16707566,16707566 : 0,0 ''
    IL_000b:  nop
    .line 19,19 : 6,15 ''
    .line 19,19 : 6,15 ''
    IL_000c:  ldarg.0
    IL_000d:  isinst     [IronScheme]IronScheme.Runtime.Cons
    IL_0012:  ldnull
    IL_0013:  cgt.un
    .line 16707566,16707566 : 0,0 ''
    IL_0015:  nop
    IL_0016:  brfalse    IL_0026

    .line 16707566,16707566 : 0,0 ''
    IL_001b:  nop
    IL_001c:  ldarg.0
    .line 20,20 : 7,14 ''
    IL_001d:  tail.
    IL_001f:  call object [IronScheme]IronScheme.Runtime.Builtins::Car(object)
    IL_0024:  ret

    .line 16707566,16707566 : 0,0 ''
    IL_0025:  nop
    IL_0026:  ldsfld object 
      [Microsoft.Scripting]Microsoft.Scripting.RuntimeHelpers::False
    IL_002b:  ldstr      "nooo"
    IL_0030:  ldarg.0
    IL_0031:  call object [IronScheme]IronScheme.Runtime.Builtins::List(object)
    .line 22,22 : 7,40 ''
    IL_0036:  tail.
    IL_0038:  call object [ironscheme.boot]#::
      'ironscheme.exceptions::assertion-violation '(object,object,object)
    IL_003d:  ret

    .line 16707566,16707566 : 0,0 ''
    IL_003e:  nop
  } // end of method 'eval-core(033)'::'::baz'

Güncelleme 3:

Sorun, 'yarı-düzeltme'. yukarıdaki Peverify raporları ret sonra tüm yöntemleri nop bağlı hatalar. Sorun gerçekten anlamıyorum. Nasıl ret bir sonra nop aradan bir doğrulama olabilir. Ölü kod bile kodu dışında () gibi ... Oh iyi, deneyler devam ediyor.

Güncelleme 4:

Evde şimdi, 'doğrulanamayan' kodu, VS2008 üzerinde çalışan ve daha kötüsü de vardır. kaldırıldı Belki de doğru hata ayıklama uğruna doğrulanamaz kod kaçmak çözüm olabilir. "Bırak" modu, tüm çıkış hala doğrulanabilir olacaktır.

Güncelleme 5:

Şimdi yukarıda benim fikrim şu an için tek uygun seçenek olduğuna karar verdik. Oluşturulan kodu doğrulanamaz olmasına rağmen, henüz 22 **'s. herhangi bulmalıyım Etkisi bu senaryo ile son kullanıcı olacak bilmiyorum.

Bir bonus olarak, benim ikinci sorun da çözülecek. :)

Burada sonlandırıyorum biraz screencast. Kesme noktaları, uygun adım//(), vb mu vurur. Sonuç olarak, istenen etkiyi.

Ben, ancak, yine de bunu yapmak için yol olarak kabul etmiyorum. Aşırı hacky bana hissediyorum. Asıl mesele üzerinde bir onay olması güzel olurdu.

Güncelleme 6:

Sadece VS2010, bazı sorunlar var gibi gözüküyor bu kodu test etmek için değiştirin:

  1. İlk Çağrı şimdi doğru adım değil. (iddia ihlali ...) çarptı. Diğer durumlarda gayet iyi çalışıyor.Bazı eski kod gereksiz pozisyonlar üretilir. Kodu kaldırıldı, beklendiği gibi çalışır. :)
  2. Daha ciddi, kesme programın ikinci çağırma (bellek kullanarak derleme, derleme dosyası için damping kesme noktaları tekrar mutlu görünüyor) başarısız.

Hem bu gibi durumlarda doğru VS2008 altında çalışmak. Temel fark VS2010, tüm uygulama altında derlendi .NET 4 ve altında .NET 2. Hem 64-bit çalışan.

Güncelleme 7:

Belirtildiği gibi, 64-bit altında çalışan mdbg aldım. Ne yazık ki, ayrıca eğer programı (bu, aynı düzeneği kullanarak değil yani çekirdekler, ama hala aynı kaynağı kullanarak alır anlamına gelir) ben yeniden kırmak için başarısız kesme sorunu var.

Update 8:

filed a bug MS sitesine kesme konusunda Connect de var.

Rant modu

Hadi bu MS, previous bugs aksine sabit olması iddiası sabit olur umarım, ama henüz halka açık olarak görülmektedir.

Rant modu kapalı

CEVAP
13 AĞUSTOS 2011, CUMARTESİ


Visual Studio hata Ayıklayıcı takımda ben bir mühendisim.

Eğer yanılıyorsam beni Düzelt, ama tek sorun sol için Pdb dan geçiş gibi geliyor .NET 4 dinamik sembol biçimi derleme bazı kesme noktaları cevapsız ediliyor.

Muhtemelen tam olarak sorunu teşhis etmek için bir kopya gerekir, ancak burada yardımcı olabilecek bazı notlar.

  1. VS (2008 )-Çalıştır olmayan bir yönetici
  2. Tüm ikinci kez herhangi bir sembol yük dolaşır? Kırma (özel durum veya çağrı Sistemi aracılığıyla.tarafından test edebilirsiniz Tanı.Hata ayıklayıcı.() Break)
  3. Bu semboller yük varsayarak, bize gönderebilir kopya var mı?
  4. Muhtemelen farkı dinamik derlenmiş kod için simge biçimi 100% arasında farklı olmasıdır .NET 2 (PDB yayını).NET 4 (IL diyorlardı sanırım DB?)
  5. 'Nop ses konusunda haklı. Aşağıda örtülü sıra noktaları oluşturmak için kurallar.
  6. Aslında farklı hatlarda şeyler yaymaya gerek yok. Varsayılan olarak, VS adım olacaktır 'sembol-tablolar nerede, derleyici yazar olarak tanımlamak ne olsun 'sembol-deyimi' anlamına gelir.' Eğer her ifade simgesi dosyasında ayrı bir şey olmak istiyorsan, bu sadece iyi çalışır.

Bu JİT örtülü bir sıra nokta aşağıdaki kurallara göre oluşturur: 1. IL nop talimatları 2. IL noktalar yığını 3. IL hemen arayın eğitimi şu talimat

Eğer bir yeniden oluşturma sorununuzu çözmek için ihtiyacımız olduğu ortaya çıktı, eğer güvenli bir şekilde böcek ve yükleme dosyaları bu orta aracılığıyla iletişime bulunabilirsiniz.

Güncelleme:

Diğer kullanıcılar bu sorunu http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=27543 Dev11 Geliştirici Önizleme deneyin ve herhangi bir geri bildirim ile yorum yapmak için yaşıyor teşvik ediyoruz. (4.5 hedef olmalıdır)

Güncelleme 2:

Leppie hata Bağlan kaydetti https://connect.microsoft.com/VisualStudio/feedback/details/684089/ olarak Dev11 Beta sürümü onun için çalışmak düzeltme http://www.microsoft.com/visualstudio/11/en-us/downloads boş doğruladı.

Teşekkürler

Luke

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BroadCity

    BroadCity

    10 ŞUBAT 2010
  • campos9896

    campos9896

    24 Mart 2012
  • Deany Boii

    Deany Boii

    27 Kasım 2007