Düzenle

Aracılığıyla paylaş


Yerel Kod Hata Ayıklaması SSS

Programımı Visual Studio hata ayıklayıcısı dışında çalıştırırken erişim ihlallerinde nasıl hata ayıklayabilirim?

Tam zamanında hata ayıklama seçeneğini ayarlayın ve erişim ihlali gerçekleşene kadar programınızı tek başına çalıştırın. Ardından, hata ayıklayıcıyı başlatmak için Erişim İhlali iletişim kutusunda İptal'e tıklayabilirsiniz.

C++ erişim ihlalinde nasıl hata ayıklayabilirim?

Birden çok işaretçiye başvuruda bulunan bir kod satırında erişim ihlali alırsanız, erişim ihlaline hangi işaretçinin neden olduğunu bulmak zor olabilir. Visual Studio'da özel durum iletişim kutusu, erişim ihlaline neden olan işaretçiyi açıkça adlandırr.

Örneğin, aşağıdaki kod göz önüne alındığında erişim ihlali almanız gerekir:

#include <iostream>
using namespace std;

class ClassC {
public:
  void printHello() {
    cout << "hello world";
  }
};

class ClassB {
public:
  ClassC* C;
  ClassB() {
    C = new ClassC();
  }
};

class ClassA {
public:
  ClassB* B;
  ClassA() {
    // Uncomment to fix
    // B = new ClassB();
  }
};

int main() {
  ClassA* A = new ClassA();
  A->B->C->printHello();

}

Bu kodu Visual Studio'da çalıştırırsanız aşağıdaki özel durum iletişim kutusunu görmeniz gerekir:

Screenshot of a Microsoft Visual Studio exception dialog, showing a read access violation for 'A->B was nullptr'. The Break button is selected.

İşaretçinin neden erişim ihlaline neden olduğunu belirleyemiyorsanız, soruna neden olan işaretçinin doğru atandığından emin olmak için kodu takip edin. Parametre olarak geçirilirse, doğru geçirildiğinden ve yanlışlıkla sığ bir kopya oluşturmadığınızdan emin olun. Ardından, programda başka bir yerde değiştirilmediğinden emin olmak için söz konusu işaretçi için bir Veri Kesme Noktası oluşturarak değerlerin istemeden programın herhangi bir yerinde değiştirilmediğini doğrulayın. Veri kesme noktaları hakkında daha fazla bilgi için Kesme Noktalarını Kullanma bölümündeki veri kesme noktası bölümüne bakın.

Kendi işaretçilerimin bellek adresini bozup bozmadığını nasıl anlarım?

Yığın bozulması olup olmadığını denetleyin. Bellek bozulmasının çoğu yığın bozulması nedeniyledir. Genel Bayraklar Yardımcı Programı (gflags.exe) veya pageheap.exe kullanmayı deneyin. Bkz. /windows-hardware/drivers/debugger/gflags-and-pageheap.

Bellek adresinin değiştirildiği yeri bulmak için:

  1. 0x00408000'da bir veri kesme noktası ayarlayın. Bkz. Veri değişikliği kesme noktası ayarlama (yalnızca yerel C++).

  2. Kesme noktasına bastığınızda, bellek içeriğini 0x00408000'den başlayarak görüntülemek için Bellek penceresini kullanın. Daha fazla bilgi için bkz . Bellek Pencereleri.

Kimin yanlış parametre değeri geçirdiğini nasıl öğrenebilirim?

Bu sorunu çözmek için:

  1. İşlevin başında bir konum kesme noktası ayarlayın.

  2. Kesme noktasına sağ tıklayın ve Koşul'u seçin.

  3. Kesme Noktası Koşulu iletişim kutusunda Koşul onay kutusuna tıklayın. Bkz. Gelişmiş Kesme Noktaları.

  4. Metin kutusuna , gibi Var==3bir ifade girin; burada Var hatalı değeri içeren parametrenin adıdır ve 3 ona geçirilen hatalı değerdir.

  5. True radyo düğmesini seçin ve Tamam düğmesine tıklayın.

  6. Şimdi programı yeniden çalıştırın. Kesme noktası, parametresi değerine 3sahip olduğunda programın işlevin başında durmasına Var neden olur.

  7. Çağıran işlevi bulmak ve kaynak koduna gitmek için Çağrı Yığını penceresini kullanın. Daha fazla bilgi için bkz . Nasıl yapılır: Çağrı Yığını Penceresini Kullanma.

İşlevi yüzlerce kere çağırırken hangi çağrının başarısız olduğunu nasıl bilebilirim?

Örnek: Programım, belirli bir işleve CnvtVyapılan çağrıda başarısız oluyor. Program muhtemelen başarısız olmadan önce bu işlevi birkaç yüz kez çağırır. üzerinde CnvtVbir konum kesme noktası ayarlarsam, program bu işleve yapılan her çağrıda durur ve bunu istemiyorum. Çağrının başarısız olmasına hangi koşulların neden olduğunu bilmiyorum, bu nedenle koşullu kesme noktası ayarlayamıyorum. Ne yapabilirim?

İşlevde İsabet Sayısı alanı olan bir kesme noktasını, hiçbir zaman ulaşılamayacak kadar yüksek bir değere ayarlayabilirsiniz. Bu durumda, işlevin CnvtV birkaç yüz kez çağrıldığına inandığınız için, İsabet Sayısı'nı 1000 veya daha fazla olarak ayarlayabilirsiniz. Ardından programı çalıştırın ve çağrının başarısız olmasını bekleyin. Başarısız olduğunda Kesme Noktaları penceresini açın ve kesme noktaları listesine bakın. Ayarladığınız CnvtV kesme noktası görünür ve ardından isabet sayısı ve kalan yineleme sayısı gösterilir:

CnvtV(int) (no condition) when hit count is equal to 1000 (currently 101)

Artık işlevin 101. çağrıda başarısız olduğunu biliyorsunuz. Kesme noktasını 101 isabet sayısıyla sıfırlar ve programı yeniden çalıştırırsanız, program çağrısında CnvtV durur ve başarısız olmasına neden olur.

Win32 hata kodlarına nereden bakabilirim?

WINERROR. Varsayılan sistem yüklemenizin INCLUDE dizinindeki H , Win32 API işlevleri için hata kodu tanımlarını içerir.

Kodu İzleme penceresine veya QuickWatch iletişim kutusuna yazarak bir hata kodu arayabilirsiniz. Örneğin:

0x80000004,hr

Uygulamamda adım adım gezinirken odağı nasıl koruyabilirim?

Örnek: Programımda pencere etkinleştirme sorunu var. Programda hata ayıklayıcıyla adım atmak, programım odağı kaybetmeye devam ettiği için sorunu yeniden oluşturma yeteneğimi engelliyor. Odaklanmayı kaybetmeyi önlemenin bir yolu var mı?

İkinci bir bilgisayarınız varsa, uzaktan hata ayıklamayı kullanın. Konakta hata ayıklayıcısını çalıştırırken programınızı uzak bilgisayarda çalıştırabilirsiniz. Daha fazla bilgi için bkz . Nasıl yapılır: Uzak Bilgisayar Seçme.

Windows API işlevlerinde nasıl hata ayıklayabilirim?

NT sembollerinin yüklü olduğu bir Windows API işlevinde kesme noktası ayarlamak için:

  • İşlev kesme noktasına işlev adını, işlevin bulunduğu DLL'nin adıyla birlikte girin (bağlam işlecine bakın). 32 bit kodda işlev adının düzenlenmiş biçimini kullanın. Örneğin MessageBeep'te bir kesme noktası ayarlamak için aşağıdakileri girmeniz gerekir.

    {,,USER32.DLL}_MessageBeep@4
    

    Süslü adı almak için bkz . Süslü Adları Görüntüleme.

    Süslü adı test edebilir ve ayrıştırma kodunda görüntüleyebilirsiniz. Visual Studio hata ayıklayıcısındaki işlevde duraklatılırken, kod düzenleyicisinde veya çağrı yığını penceresinde işleve sağ tıklayın ve Ayrıştırmaya Git'i seçin.

  • 64 bit kodda, sıralanmamış adı kullanabilirsiniz.

    {,,USER32.DLL}MessageBeep
    

Sonraki adımlar

Aşağıdaki bağlantıları kullanarak Visual Studio'da yerel kod hata ayıklama hakkında daha fazla bilgi edinebilirsiniz: