Bagaimana cara men-debug pelanggaran akses saat menjalankan program saya di luar debugger Visual Studio?
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.
Bagaimana cara men-debug pelanggaran akses C++?
Jika Anda mendapatkan pelanggaran akses pada baris kode yang mendereferensikan beberapa pointer, mungkin sulit untuk mengetahui pointer mana yang menyebabkan pelanggaran akses. Di Visual Studio, kotak dialog pengecualian secara eksplisit memberi nama penunjuk yang menyebabkan pelanggaran akses.
Misalnya, dengan kode berikut, Anda harus mendapatkan pelanggaran akses:
#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();
}
Jika Anda menjalankan kode ini di Visual Studio, Anda akan melihat dialog pengecualian berikut:
Jika Anda tidak dapat menentukan mengapa penunjuk menyebabkan pelanggaran akses, lacak melalui kode untuk memastikan bahwa penunjuk yang menyebabkan masalah telah ditetapkan dengan benar. If it is passed as a parameter, make sure that it is passed correctly, and you aren't accidentally creating a shallow copy. Kemudian verifikasi bahwa nilai tidak diubah secara tidak sengaja di suatu tempat dalam program dengan membuat Titik Henti Data untuk pointer yang dimaksud untuk memastikan nilai tersebut tidak dimodifikasi di tempat lain dalam program. For more information about data breakpoints, see the data breakpoint section in Using Breakpoints.
Bagaimana cara mengetahui apakah pointer saya merusak alamat memori?
Periksa kerusakan tumpukan. Sebagian besar kerusakan memori disebabkan oleh kerusakan tumpukan. Coba gunakan Utilitas Bendera Global (gflags.exe) atau pageheap.exe. Lihat GFlags dan PageHeap.
Untuk menemukan di mana alamat memori dimodifikasi:
Atur titik henti data di 0x00408000. Lihat Mengatur titik henti perubahan data (hanya C++ asli).
When you hit the breakpoint, use the Memory window to view memory contents starting at 0x00408000. For more information, see Memory Windows.
Bagaimana cara mengetahui siapa yang meneruskan nilai parameter yang salah?
Untuk mengatasi masalah ini:
Atur titik henti lokasi di awal fungsi.
Right-click the breakpoint and select Condition.
In the Breakpoint Condition dialog box, click on the Condition check box. See Advanced Breakpoints.
Masukkan ekspresi, seperti
Var==3, ke dalam kotak teks, di manaVaradalah nama parameter yang berisi nilai buruk, dan3merupakan nilai buruk yang diteruskan ke dalamnya.Select the is True radio button, and click the OK button.
Sekarang jalankan program lagi. Titik henti menyebabkan program berhenti di awal fungsi ketika
Varparameter memiliki nilai3.Gunakan jendela Call Stack untuk menemukan fungsi panggilan dan navigasikan ke kode sumbernya. Untuk informasi selengkapnya, lihat Cara: Menggunakan Jendela Tumpukan Panggilan.
Saat memanggil fungsi ratusan kali, bagaimana cara mengetahui panggilan mana yang gagal?
Contoh: Program saya gagal pada panggilan ke fungsi tertentu, CnvtV. Program ini mungkin memanggil fungsi itu beberapa ratus kali sebelum gagal. Jika saya mengatur titik henti lokasi pada CnvtV, program berhenti pada setiap panggilan ke fungsi itu, dan saya tidak ingin itu. Saya tidak tahu kondisi apa yang menyebabkan panggilan gagal, jadi saya tidak dapat mengatur titik henti kondisi. Apa yang bisa saya lakukan?
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. Kemudian jalankan program dan tunggu hingga panggilan gagal. Saat gagal, buka jendela Titik Henti dan lihat daftar titik henti. Titik henti yang Anda tetapkan CnvtV muncul, diikuti dengan jumlah hit dan jumlah iterasi yang tersisa:
CnvtV(int) (no condition) when hit count is equal to 1000 (currently 101)
Anda sekarang tahu bahwa fungsi gagal pada panggilan ke-101. Jika Anda mengatur ulang titik henti dengan hit count 101 dan menjalankan program lagi, program berhenti pada panggilan yang CnvtV menyebabkannya gagal.
Di mana saya dapat mencari kode kesalahan Win32?
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
Bagaimana cara menjaga fokus saat menelusuri aplikasi saya?
Contoh: Program saya mengalami masalah aktivasi jendela. Melangkah melalui program dengan debugger mengganggu kemampuan saya untuk mereproduksi masalah karena program saya terus kehilangan fokus. Apakah ada cara untuk menghindari kehilangan fokus?
Jika Anda memiliki komputer kedua, gunakan penelusuran kesalahan jarak jauh. Anda dapat mengoperasikan program Anda di komputer jarak jauh saat menjalankan debugger pada host. Untuk informasi selengkapnya, lihat Cara: Pilih Komputer Jarak Jauh.
Bagaimana cara men-debug fungsi Windows API?
Untuk mengatur titik henti pada fungsi Windows API dengan simbol NT dimuat:
In the function breakpoint, enter the function name together with the name of the DLL where the function resides (see the context operator). Dalam kode 32-bit, gunakan bentuk nama fungsi yang didekorasi. To set a breakpoint on MessageBeep, for example, you must enter the following.
{,,USER32.DLL}_MessageBeep@4Untuk mendapatkan nama yang didekorasi, lihat Menampilkan Nama Yang Didekorasi.
Anda dapat menguji nama yang didekorasi dan melihatnya dalam kode pembongkaran. Saat dijeda pada fungsi di debugger Visual Studio, klik kanan fungsi di editor kode atau jendela tumpukan panggilan dan pilih Buka Pembongkaran.
Dalam kode 64-bit, Anda dapat menggunakan nama yang tidak terdekorasi.
{,,USER32.DLL}MessageBeep
Next steps
Anda dapat mempelajari selengkapnya tentang penelusuran kesalahan kode asli di Visual Studio menggunakan tautan ini: