Nasıl yapılır: düz Thunks hata ayıklama

Makale çevirileri Makale çevirileri
Makale numarası: 133722 - Bu makalenin geçerli olduğu ürünleri görün.
Hepsini aç | Hepsini kapa

Bu Sayfada

Özet

Düz thunks thunk derleyici tarafından üretilen hata ayıklama thunk mekanizması karmaşıktır ve hata ayıklama araçları thunks izleme ulaşabileceği kullanmak zor olduğundan zor olabilir. Bu makalede, düz thunks birkaç belirli hata ayıklama teknikleri ve birçok genel thunking sorunları nasıl yükleneceğini açıklayan bir sorun giderme kılavuzu için hata ayıklama için genel bir strateji sunar.

Daha fazla bilgi

Bir hedef DLL ne, sınırlamaları

Thunks hata ayıklama işlemi başlamadan önce DLL içinde bir thunk yapmak için hangi hedef bazı kısıtlamalar bulunmaktadır göz önünde bulundurun. Win32 temel alan bir DLL arama Win16 tabanlı bir uygulama bir Win32 temel alan bir işlem olduğundan bu; benzer şekilde, bir Win16 tabanlı DLL arama bir Win32 uygulaması Win16 temel alan bir işlem değil. Ortak ve özel sınırlamalar şunları içerir:

  • Win 32 tabanlı bir DLL için Win16 tabanlı bir uygulama iş parçacığı bir thunk içinde oluşturamazsınız.
  • Win 32 tabanlı thunks tarafından adlı DLL içinde kod, arama Win16 tabanlı işlemler Win 32 tabanlı uygulamalar için daha çok daha yığınlarının olduğundan az yığın alanı istemeniz gerekir.
  • Kesme hizmeti yordamlarına (ISRs) içeren Win16 tabanlı dll Win 32 tabanlı DLL'lere kesmeler işlerken thunk gerekir değil.
  • Win 32 tabanlı uygulamalarda işaretçi yığına thunks veya çağrı yığınları geçiş Win16 tabanlı dll parametreleri olarak bulunan verilere geçmelidir değil.

Neden düz Thunks Debugging zor

Kısmen, Windows çekirdeğinde, karmaşık bir bölümü düz thunk mekanizması olduğundan, düz thunks hata ayıklama zordur. Işlev çağrıları, 32-bit derlenmiş kod dönüştürme gerekir gerçeğini gelen, karmaşıklık kuyruklarla çağırır uyumlu 16-bit kodu ve bunun tersi de geçerlidir. 32-Bit farklı veri türlerini kullanır ve CPU kayıt kümeleri 16 bit kodundan düz thunk mekanizması, işlev parametreleri çevirmek, yığınlarının geçin ve dönüş değerlerini çevirmek gerekir. Hız için en iyi duruma getirilmiştir henüz preemptive Win32 kodu preemptive olmayan bir Win16 kodu çağırmak izin vermesi gerekir. Oluşturma düz thunks thunk derleyici el ile oluşturmak çok kolay hale getirir, ancak bu kusursuz değildir.

Gerekli hata ayıklama araçları daha zor olduğu için yalnızca mekanizması kendisi de karmaşık olduğundan düz thunks hata ayıklama zor değildir Yöneticisi. Uygulama düzeyinde, hem 32-bit ve 16-bit kodu oluşur ve sistemin talep veya Win16Mutex serbest WinDBG ve Microsoft Visual C++ hata ayıklayıcısı thunks izleme edemiyor gibi debuggers. Bir thunk izlemek için <a0></a0>, WDEB386.EXE gibi sistem düzeyi hata ayıklayıcısını kullanmak gerekir. ıntel x 86 derleme ıntel x 86 mikroişlemciler çalışması, bildiğiniz dili bilmeniz gerektiğini WDEB386.EXE kullanmanın önemli bir dezavantajları olduğundan ve komutların çoğu hata ayıklayıcı unutmayın.

Kullanılacak en iyi strateji

Çünkü fethedin Bölünecek thunks hata ayıklama için en iyi strateji ise nispeten kolaydır ve sistem düzeyinde bir hata ayıklayıcı derleme dil kodunu izlemek için gereken zamandan önce sorunların çoğunu ortadan kaldırır. Her birinde, önce bunları birlikte sınama yalıtım sınanacak olasıdır; bu nedenle düz thunks Win32 DLL ile Win16 temel alan bir DLL oluşur. Win16 tabanlı DLL sınanacak Win16 tabanlı bir uygulama oluşturabilir ve Win 32 tabanlı DLL sınamak için bir Win32 uygulaması. Böylece her iki tarafı düzgün çalıştığını doğrulamak için hata ayıklama araçları, çeşitli kullanmanızı sağlar.

Denetim listesi, Thunk Derleyici ile derleniyor önce ön-

Bu, her iki tarafı düzgün çalıştığını doğruladıktan sonra ikisi birlikte thunk kendisini sınanacak koymak zamanı geldi. Thunk Derleyici ile thunk derlemek için önce aşağıdaki öğelerin ön onay olun:
  1. Thunk komut dosyas?nda, her bir işlevi doğru numarayı ve parametre türleri olmasına dikkat edin. Ayrıca parametre türleri thunk derleyici tarafından desteklendiğinden emin olun. Bunlar, parametre, desteklenen bir türü olan veri şekilde değiştirmeniz gerekir.
  2. Parametre olarak herhangi bir yapılarının başarılı olursa, Win 32 tabanlı DLL, DLL Win16 tabanlı ve thunk komut dosyası içinde aynı yapıya kullandığınızdan emin olun. C/C++ Derleyici ait komut satırı ve komut satırında thunk derleyici yapısı sevk ayarlayın. Ambalaj anahtarı thunk derleyici'nın 16-bit tarafı için küçük ve büyük, 32-bit tarafı için olduğunu unutmayın.
  3. Için thunking işlevleri doğru verilir ve bunlar 32 bit, 16-bit oldukları için kuralı veya _stdcall çağrılıyor PASCAL kullanmak emin olun. Thunk derleyici _cdecl ve kuralları çağrılıyor __fastcall desteklemiyor.
  4. Win 32 tabanlı DLL dosyanızın ThunkConnect32()'ı her DllMain() işlevi adlı aradığından emin olun. Benzer şekilde, bir verilen DllEntryPoint() işlevi, ThunkConnect16() çağırır ve ThunkConnect16() başarılı ise DOğRU sonucunu verir, LibMain() ayrı Win16 tabanlı DLL olmasına dikkat edin.

    Not:, gerçekte XXX_ThunkConnect16() ve XXX_ThunkConnect32() XXX olduğunu simgeyi arayın thunk derleyici'nin t - anahtarla tanımlayın. Thunk derleyici tarafından üretilen kod ThunkConnect16() ve ThunkConnect32 tablolar oluşturmak için bu simgeler kullanır.
  5. Thunk derleyici ait komut satırı anahtarı -t Belirtilen değer Win32 ve Win16 thunk dll için aynı olduğundan emin olun. Değer de önekini (bkz: Not 4. adımda) ThunkConnect çağrılarında Win16 tabanlı ve Win 32 tabanlı dll dosyalarını karşılık gelmelidir.
  6. Win16 tabanlı DLL kendi <a0>modülü</a0> <a1>tanım</a1> (.def) dosyası RESIDENTNAME anahtar sözcüğü ile verilen DLLEntryPoint olduğunu doğrulayın. RESIDENTNAME anahtar sözcüğü olmaksızın ThunkConnect32/ThunkConnect16 çağrısı başarısız olur ve DLL'lerin yüklenmeyecek.
  7. 16 Bit DLL kendi <a0>modülü</a0> <a1>tanım</a1> (.def) dosyası RESIDENTNAME anahtar sözcüğü ile verilen XXX_ThunkData16 olduğunu doğrulayın.
  8. Kaynak derleyici 4.0 DLL işaretlemek sizin Win16 tabanlı DLL makefile doğrulayın. 4. 0'Dan daha az olarak işaretlenmişse, bu yüklenmiyor ve thunk başarısız olur.
  9. 32-Bit, 16 bit thunk işlevinizin bir işaretçi döndürür, temel tür iki hem 16-bit ve 32-bit yanda thunk, üzerinde aynı boyutta olduğundan emin olun. Temel tür boyutunu farklı ise, thunk derleyici "işaretçileri aynı olmayan için dönüş türü başlatılamıyor.", bildiren bir hata iletisi sorunları Bu soruna geçici bir çözüm bulmak için bir işaretçi için farklı, ancak uyumlu bir veri türü dönmek için yoludur. Örneğin, bir int, 16-bit yanında, ancak dört bayt 32-bit tarafında iki bayt olduğundan bir thunk int için bir işaretçi döndüremez. Bir işaretçi thunk komut dosyası ve kaynak kodu Win16 tabanlı ve Win 32 tabanlı dll bir uzun bir işaretçi bir int thunk ait dönüş türü değiştirin.

    Bir 32-bit için 16 bit thunk yazarsanız, bir işaretçi döndürür, thunk derleyici bildiren bir hata iletisi sorunları, "işaretçi türleri döndürülmez." Thunk derleyici thunk 32-bit işlevinden döndürdü, sonra işaretçiyi verileri doğru Win 32 tabanlı işlem adres alanı işaret edecek değil çünkü işaretçi türleri dönmek, 32-bit için 16 bit thunks izin vermiyor. Win 32 tabanlı tüm işlemlerin adres alanlarını aynı aralık adresleri kullanır ve içerik anahtarlamalı preemptively olmasıdır.
  10. The linker "dış çözülmeyen" hata raporlarını ve simge tüm kaynak kodun tutarlı bir şekilde yazıldığından işlev adı Modül tanım dosyalarını ve thunk komut dosyası, prototip tüm tekrarlarını tutarlı olduğundan emin olun. Win32 tarafındaki thunk işlevi __stdcall türüyle bildirilmelidir; Win16 tarafında, işlev PASCAL türüyle bildirilmelidir. C++ projede bildirmek ve __stdcall veya PASCAL türü yanında dış "C" bağlantı belirtici olan thunk işlevi her iki tarafına dikkat edin.

Sonra Thunk Derleyici ile derleniyor trouble-Shooting Kılavuzu-

The preliminaries denetledikten sonra dll thunk oluşturmak ve bunları çalıştırmayı deneyin. Bunlar çalıştırırsanız, başka kullanıcıların rock düz emin olmak için sınama ile devam edin. Kullanıcılar çalıştırma, sorunun nedenini belirlemek ve aşağıdaki sorun giderme kılavuzu kullanın.

Win32 tarafındaki Win16 veya ThunkConnect32() ThunkConnect16() başarısız:

  1. Sistem DLL'leri hata ayıklama sürümlerini çalıştırın. Hata ayıklama sürümlerini KERNEL32.DLL ve KRNL386.EXE the thunk değil neden başlatılamadı bildirmek için çok sayıda tanılama iletileri içerir. Sistem DLL'leri hata ayıklama sürümlerini çalıştırmak için <a0></a0>, Win32 SDK Araçlar'ın altında <a2>Başlat</a2> menüsündeki "Anahtarı için hata ayıklama dll" simgesini kullanın. "Anahtarı" olmayan hata ayıklama dll için kullanırsanız perakende sürümüne geçmek için.
  2. Win16 tabanlı DLL ThunkConnect16() bir ça?r? varsa ve Win 32 tabanlı DLL ThunkConnect32() karşılık gelen bir ça?r? olduğunu doğrulayın. Bunlardan biri eksikse, daha sonra diğer başarısız olur ve thunk DLL yükleme başarısız olur.
  3. Kesme noktaları Win32 DLL DllMain() yerleştirin ve Win16 DLL DllEntryPoint() ve LibMain() hangi dll görmek için işlevler değil yükleniyor.
ThunkConnect16() ve ThunkConnect32() aramalarınız çalışır, ancak thunk hala değilse, bunu sizin thunk basitleştirmek için saattir. Gerçekten bu iki yolla saldırabilir. Önce parametreler, tek tek thunk kaldırma ve yeniden recompiling başlatın. Veya, ikinci olarak, çalışan basit bir thunk oluşturun ve kadar aşağıdaki adımları izleyerek başarısız, oluşturma:
  1. Basit bir thunk oluşturmak ve yalnızca thunk düzenek doğru şekilde kurulmuş olduğundan emin olmak için execute. Basit bir thunk için iyi BIR seçenektir, dönüş değeri yok ve parametre ile bir işlevdir. Basit thunk bile işe yaramazsa, işlemler doğru şekilde kurulmuş olduğundan emin olmak için yukarıdaki ön denetim çalıştırın. Adım 2'ile devam edin.
  2. Hedef DLL emin olmak için denetleyin ve onu esas herhangi bir DLL bulunamadı ve yüklü. Bir eksik ya da yükleyicinin bulunamıyor, thunk çalışmaz.
  3. DLL, onu bir thunk bağlamında başlatamıyor yaparak değilse, hedef emin olun.
Çalışan Basitleştirilmiş bir thunk vardır, ancak, gerçek thunk yine çalışmıyor sonra aşağıdaki adımları izleyin:
  1. Parametreleri basit thunk için bir parametre hatası neden olup olmadığını belirlemek için birer birer ekleyin. Ise, parametre işlev bildirilen ve aynı sayısını ve her iki dll ve thunk derleyici, bir parametre türleri ile tanımlanmış sağ türü ve işlev PASCAL veya _stdcall olarak bildirilmiş dikkat edin.
  2. DLL, hedef bir Win16 tabanlı DLL, genel veya statik verilerine erişilemiyor, doğru işlev dışa dikkat edin. Visual C++ ile /GD anahtarı kullanırsanız, bildirmek ve Win16 tabanlı DLL kaynak kodunda __export anahtar sözcüğüyle işlev tanımlayın. Derleyici giriş oluşturan olmaz ve işlevleri dışa epilog kod gerektiren .def dosyası işlemez yalnızca işlevin adını DLL modülünü <a1>tanım</a1> (.def) dosyasındaki kod yeterli değildir.
  3. Kendi hedef Win16 tabanlı DLL neden genel koruma (GP) hataları, LocalAlloc() yapılan emin olursanız, 2. adımda anlatıldığı gibi işlevinizin verilir.
  4. Yalnızca, hedef Win16 tabanlı işlevini verir sonra Kernel32'de bir GP hatası alırsanız, hedef işlevi bildirilen ve PASCAL tanımlanan dikkat edin. C çağırma kuralı kullanılamaz. C veya C++ kod derleme dilde daha büyük olasılıkla ancak seyrek de hedef işlevi DS, BB, BP, SI veya DI yazmaçların değişiklik olmadı dikkat edin.
  5. Hemen, Win 32 tabanlı hedef işlevini verir sonra 32-bit thunk içinde ya da Kernel32 DLL GP bir hata alırsanız, hedef işlevinin _stdcall bildirilmiş ve DS, ES, TB, BB, EBP, EBX, ESI veya EDI yazmaçların değişiklik olmadı emin olun. C veya C++ kod değiştirilecek olan kayıtları neden olmamalıdır, ancak dikkatli bir Çevirici dil kodu denetlenmelidir.
  6. Win16 tabanlı bilgisayarınızın hedef işlevi geçersiz bir konuma döndürür bildirilen ve FAR tanımlanan emin olursanız. Bu küçük modeli dll için özellikle önemlidir; orta ve büyük modeli dll fonksiyonlarında FAR varsayılan.
  7. 64 K'parametre (diğer bir deyişle thunked bir işaretçi) olarak geçirilen işaretçi verilerin birden çok eriştiğinizde, bir Win16 tabanlı işlevi GP hatasına karşılaşırsanız, döşenmiş seçiciler, bir dizi tahsis etmek Microsoft Knowledge Base'de aşağıdaki makalede açıklanan gerekenler:
    132005DOCERR: AllocSelector & FreeSelector belgeleri tamamlanmadı
    Win16 tarafında thunked işaretçileri her zaman tek bir satır seçicisini çok büyük bir işaretçi kullanamazsınız; 64 K sınırı ile oluşur. Win16 tabanlı hedef - DLL ancak döşenmiş seçiciler buna başvurmak için bir dizi oluşturursa ve veriye erişmek için çok büyük bir işaretçi değişkeni kullanıyorsa, tüm özgün, işaretçi ele veri aralığını erişilebilir.
  8. The thunk bağlamında yalnızca thunked işaretçi kullandığınızdan emin olun. The thunk sayı olarak kullanılacak thunk derleyici tarafından Win16 tabanlı hedefleri tarafından ayrılan seçiciler serbest.
  9. Bunlara alma emin olmak için <a2>hedef</a2> işlevleri başında kesme noktaları yerleştirin. Olduğunuz, hedef tarafında thunk bağımsız debugged ve hedef içinde hataya, büyük olasılıkla hedef öğe içinde bir thunk yapılması başlatamıyor yapmak veya var olmayan belleğe başvuru, iyi. Lütfen 7 ve 8 numaralı adımları bakın.

Özellikler

Makale numarası: 133722 - Last Review: 11 Temmuz 2005 Pazartesi - Gözden geçirme: 2.3
Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Platform Software Development Kit - Ocak 2000 Sürümü, Ne zaman ne ile kullanilir:
    • Microsoft Windows 95
    • Microsoft Windows 98 Standard Edition
    • Microsoft Windows Millennium Edition
Anahtar Kelimeler: 
kbmt kbhowto kbkernbase kbprogramming KB133722 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:133722

Geri Bildirim Ver

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com