Programımı Visual Studio hata ayıklayıcısı dışında çalıştırırken erişim ihlallerinde nasıl hata ayıklayabilirim?
Set the Just-in-time debugging option and run your program stand-alone until the access violation occurs. Then, in the Access Violation dialog box, you can click Cancel to start the debugger.
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:
İş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. If it is passed as a parameter, make sure that it is passed correctly, and you aren't accidentally creating a shallow copy. 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. For more information about data breakpoints, see the data breakpoint section in Using Breakpoints.
İşaretçilerimin bir bellek adresini bozmuş olup olmadığını nasıl öğrenebilirim?
Yığın bozulması olup olmadığını denetleyin. Bellek bozulmasının çoğu yığın bozulması nedeniyledir. Genel Bayraklar Yardımcı Programı 'nı (gflags.exe) veya pageheap.exekullanmayı deneyin. Bkz . GFlags ve PageHeap.
Bellek adresinin değiştirildiği yeri bulmak için:
0x00408000'da bir veri kesme noktası ayarlayın. Bkz. Veri değişikliği kesme noktası ayarlama (yalnızca yerel C++).
When you hit the breakpoint, use the Memory window to view memory contents starting at 0x00408000. For more information, see Memory Windows.
Kimin yanlış parametre değeri geçirdiğini nasıl öğrenebilirim?
Bu sorunu çözmek için:
İşlevin başında bir konum kesme noktası ayarlayın.
Right-click the breakpoint and select Condition.
In the Breakpoint Condition dialog box, click on the Condition check box. See Advanced Breakpoints.
Metin kutusuna , gibi
Var==3bir ifade girin; buradaVarhatalı değeri içeren parametrenin adıdır ve3ona geçirilen hatalı değerdir.Select the is True radio button, and click the OK button.
Şimdi programı yeniden çalıştırın. Kesme noktası, parametresi değerine
3sahip olduğunda programın işlevin başında durmasınaVarneden olur.Ç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.
Bir işlevi yüzlerce kez ç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?
You can set a breakpoint on the function with the Hit Count field to a value so high that it will never be reached. In this case, because you believe the function CnvtV is called a couple hundred times, you might set Hit Count to 1000 or more. 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ını nereden arayabilirim?
WINERROR.H in the INCLUDE directory of your default system installation contains the error code definitions for the Win32 API functions.
You can look up an error code by typing the code in the Watch window or the QuickWatch dialog box. For example:
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şlevlerinin hatalarını nasıl ayıklayabilirim?
NT sembollerinin yüklü olduğu bir Windows API işlevinde kesme noktası ayarlamak için:
In the function breakpoint, enter the function name together with the name of the DLL where the function resides (see the context operator). 32 bit kodda işlev adının düzenlenmiş biçimini kullanın. To set a breakpoint on MessageBeep, for example, you must enter the following.
{,,USER32.DLL}_MessageBeep@4Sü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
Next steps
Aşağıdaki bağlantıları kullanarak Visual Studio'da yerel kod hata ayıklama hakkında daha fazla bilgi edinebilirsiniz:
- Yerel kod hata ayıklama