Bir işlevde bir hata oluştuğunda, özellikle bu işlevin bir düzine farklı yerden çağrıldığı sırada, ona yol açan olayların sırasını bilmek isterim. Çağrı yığınının VB6'ya alınmasının herhangi bir yolu var mı, yoksa bunu zor yoldan mı yapmalıyım (ör., Her işlevde ve kayıt işleyicisinde günlük girdileri, vb.)?Arama yığınını programlı olarak VB6'ya almak mümkün mü?
cevap
Eminim ki bunu zor yoldan yapmanız gerekiyor. Daha önceki bir işimde, DCOM bileşenleri ile VB6 için çok zarif bir hata işleme sürecimiz vardı. Ancak, her yönteme eklenecek çok fazla kod vardı, o kadar ki sizin için tüm bunları eklemek için evde yetiştirdiğimiz araçlar vardı.
Uygulaması hakkında çok fazla bilgi sağlayamıyorum (her ikisi de çoğunu unutmadığım ve bunun bir ticari sır olarak kabul edebileceği bir şans olduğu için). Göze çarpan bir şey, yöntem adının çalışma zamanında türetilememesiydi, bu nedenle bir dize değişkeni olarak eklendiler (bazı geliştiriciler aracı kullanmak yerine kopyalayıp yapıştırırlardı ve yalan söyleyen hata yığınlarına yol açardı). ..).
HTH
Zor, manuel yol tek yoldur. this sorusunu kontrol ederseniz, birisi sizin için çok işe yarayan MZTools adlı bir araç önermiştir.
Yıllardır MZTools'u kullanıyorum ve bunun harika bir araç olduğunu kabul ediyorum. Ancak, "fakir adamın yığın izine" bir alternatif arıyordum. Orada bir tane olduğunu düşünmedim, ama burada sormak için acımadığını düşündüm. – raven
Compuware (veya o anda Numega mıydı) Visual Studio 6 için DevStudio bunu yapmak için kullanılır. Yol, kod yığına eklenen çok küçük bir snippet denilen her aramaya ekleme enstrümanı eklemekti. Herhangi bir hatanın üzerine, calltack'ı terk etti ve daha sonra posta gibi bir şey yaptı ya da bir web sunucusuna tüm hata ayıklama bilgilerini gönderdiler. Enstrümantasyonun eklenmesi ve çıkartılması potansiyel olarak ölümcül bir işlemdi (özellikle de VSS'yi kaynak kontrolümüz olarak kullandığımızda), fakat işe yaradıysa, iyi çalışıyor.
Darrel pointed out olarak, MZTools'u kullanarak ve bir şablon ayarlayarak çok simlar bir şey ekleyebilirsiniz. Çok çalışıyor ve muhtemelen ödülden daha etkilidir ama eğer hataları izlemek çok zor ise, bu yardımcı olabilir.
Sen zor yoldan yapmak zorunda, ama o ... bir kez şablonu yazdım kez Ciddi, bu hızlı kopyala/yapıştır var/maç zor değiştirmek tüm gerçekten değil Err.Raise deyimindeki işlev adı, gerçek işlev adına. Her rutin onun Handler vurur ve hata açıklaması adını ekler olarak
Private Function DoSomething(ByVal Arg as String)
On Error GoTo Handler
Dim ThisVar as String
Dim ThatVar as Long
' Code here to implement DoSomething...
Exit Function
Handler:
Err.Raise Err.Number, , "MiscFunctions.DoSomething: " & Err.Description
End Function
çağrı iç içe sonra, bu unwinds. Üst düzey işlevinde, çağrılan rutinlerin listesini ve gerçekte gerçekleşen hatanın hata numarasını ve açıklamasını gösteren bir "çağrı yığını" elde edersiniz. Mükemmel değil, çünkü satır numaralarını alamıyorsunuz, ama genellikle probleminize yolunuzu bulmak için onlara ihtiyacınız olmadığını öğrendim. (Ve eğer satır numaralarını gerçekten istiyorsanız, bunları işleve ekleyebilir ve Erl değişkenini kullanarak Err.Raise deyiminde kullanabilirsiniz. Satır numaraları olmadan, sadece 0 değerini döndürür.)
Ayrıca, kendisini işlev, bunu böyle mesajında ilginç değişkenlerin değerleri ile kendi hataları yükseltebilirsiniz:
Err.Raise PCLOADLETTER_ERRNUM, , "PC Load Letter error on Printer """ & PrinterName & """"
(dizim önizleme sakat görünüyor ... Ben yayınlanmıştır zaman nasıl görüneceğini merak ediyorum)
PC load letter için tavsiye edilmiştir. – rpetrich
Diğer insanların dediği gibi (yıllar önce, görüyorum ... ama VB6 kullanan çok fazla insan var! :)), sanırım progr yapmak mümkün değil 3. taraf bir araç kullanmıyorsanız, Çağrı Yığını'nı ammatik olarak alın.
Ancak, hata ayıklama amacıyla bunu yapmanız gerekiyorsa, çağrılan adı isteğe bağlı bir giriş dizesi değişkeni eklemeyi düşünebilirsiniz, arayanın adını koyacaktınız.
Sub MyRoutine
(...) ' Your code here
call DoSomething (Var1, Var2, Var3, "MyRoutine")
' ^
' Present routine's name -----------+
(...) ' Your code here
End Sub
Public DoSomething (DoVar1, DoVar2, DoVar3, Optional Caller as string = "[unknown]")
Debug.Print " DoSomething Routine Called. Caller = " & Caller
... ' (your code here)
End Sub
Pek şık değil belki ama benim için çalıştı.
Selamlar, Max - İtalya
Kim daha önce VB6'nın zarif olduğunu söyledi? – RubberDuck
- 1. Onbeforeunload olayını programlı olarak tetiklemek mümkün mü?
- 2. iPhone'u programlı olarak kapatmak mümkün mü?
- 3. Info.plist'i düzenleme programlı olarak mümkün mü?
- 4. farklı sonuçlar almak mümkün mü?
- 5. AngularJS'de sertifika almak mümkün mü?
- 6. clojure.test'in çıktısını almak mümkün mü?
- 7. RSS arşivini almak mümkün mü
- 8. Android'de Skype hesabımdan kişileri almak mümkün mü?
- 9. Etkileşimli rmarkdown belgesinde knitr önbellek yığınını kullanmak mümkün mü?
- 10. Kullanıcı Denetimi Silverlight Kılavuz Sütunu'na programlı olarak eklemek mümkün mü?
- 11. APPWIDGET_UPDATE için programlı olarak bir amaç atmak mümkün mü?
- 12. Dosyaları programlı olarak kablosuz bir SD karta itmek mümkün mü?
- 13. Vardiya ve kontrol tuşlarının durumunu programlı olarak ayarlamak mümkün mü?
- 14. Logback log dosyalarını programlı olarak bulmak mümkün mü?
- 15. USB iletişim modunu programlı olarak tanımlamak mümkün mü?
- 16. Google'dan programlı olarak PC'ye oynamak için apk indirmek mümkün mü?
- 17. Scala REPL istemini programlı olarak değiştirmek mümkün mü?
- 18. Kapağın arayan nesnesini groovy olarak almak mümkün mü?
- 19. Tek bir sonucu toplu olarak almak mümkün mü?
- 20. Android'de video çözünürlüğünü almak mümkün mü?
- 21. Haskell Tür Tip Oluşturucu almak mümkün mü?
- 22. jqGrid Arama Kutusu Sayfasında Kalmak Mümkün mü?
- 23. Vim'de komutları sıraya almak mümkün mü?
- 24. Hata veren satır numarasını almak mümkün mü?
- 25. DateInterval nesnesinden "interval_spec" dizesini almak mümkün mü?
- 26. Yönlendirme yöntemini VB.NET'te almak mümkün mü?
- 27. Tkinter'da widget ayarları almak mümkün mü?
- 28. Mesajları Android emülatörüne almak mümkün mü?
- 29. JSON üzerinden e-posta almak mümkün mü?
- 30. Ham param dizisini raylara almak mümkün mü?
Bu bunu yapmak için bildiğim tek yol bu. Aşağıda önerildiği gibi, MZTools yardımcı olabilir. Hata işleyiciniz için şablonunuzda, hatayı yaymayacaksanız, mevcut işlevinizi/alt öğenizi err.source'a ekleyin. –
İstediğimi yapmanın bir yolu olmadığına inanıyorum, bu yüzden bu cevabı kabul edeceğim. – raven