2008-09-24 27 views
12

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

9

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

+0

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. –

+0

İstediğimi yapmanın bir yolu olmadığına inanıyorum, bu yüzden bu cevabı kabul edeceğim. – raven

3

Zor, manuel yol tek yoldur. this sorusunu kontrol ederseniz, birisi sizin için çok işe yarayan MZTools adlı bir araç önermiştir.

+0

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

0

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.

11

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)

+1

PC load letter için tavsiye edilmiştir. – rpetrich

1

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

+0

Kim daha önce VB6'nın zarif olduğunu söyledi? – RubberDuck

İlgili konular