Hata Ayıklama Olayları
Hata ayıklama olayı, sistemin hata ayıklayıcıyı bilgilendirmesine neden olan, hata ayıklanan işlemdeki bir olaydır. Hata ayıklama olayları arasında işlem oluşturma, iş parçacığı oluşturma, dinamik bağlantı kitaplığı (DLL) yükleme, DLL'yi kaldırma, çıkış dizesi gönderme ve özel durum oluşturma sayılabilir.
Hata ayıklayıcı beklerken hata ayıklama olayı oluşursa sistem, waitForDebugEventtarafından belirtilen DEBUG_EVENT yapısını olayı açıklayan bilgilerle doldurur.
Sistem bir hata ayıklama olayının hata ayıklayıcısını bilgilendirdiğinde, etkilenen işlemdeki tüm iş parçacıklarını da askıya alır. İş parçacıkları, hata ayıklayıcı ContinueDebugEventkullanarak hata ayıklama olayına devam edene kadar yürütmeyi sürdürmez. Bir işlem hata ayıklanırken aşağıdaki hata ayıklama olayları oluşabilir.
Hata ayıklama olayı | Açıklama |
---|---|
CREATE_PROCESS_DEBUG_EVENT |
Hata ayıklanan bir işlemde yeni bir işlem oluşturulduğunda veya hata ayıklayıcı zaten etkin olan bir işlemde hata ayıklamaya başladığında oluşturulur. Sistem, işlem kullanıcı modunda yürütülmeye başlamadan ve sistem yeni işlem için başka hata ayıklama olayları oluşturmadan önce bu hata ayıklama olayını oluşturur. DEBUG_EVENT yapısı CREATE_PROCESS_DEBUG_INFO bir yapı içerir. Bu yapı, yeni işlemin tutamacını, işlemin görüntü dosyasının tutamacını, işlemin ilk iş parçacığının tutamacını ve yeni işlemi açıklayan diğer bilgileri içerir. İşlemin tanıtıcısı PROCESS_VM_READ ve PROCESS_VM_WRITE erişime sahiptir. Bir hata ayıklayıcının iş parçacığına bu tür erişimi varsa, ReadProcessMemory ve WriteProcessMemory işlevlerini kullanarak işlemin belleğini okuyabilir ve yazabilir. Sistem daha önce bir EXIT_PROCESS_DEBUG_EVENT olayı bildirmişse, hata ayıklayıcı ContinueDebugEvent işlevini çağırdığında sistem bu tanıtıcıyı kapatır. İşlemin görüntü dosyasının tanıtıcısı GENERIC_READ erişime sahiptir ve okuma paylaşımı için açılır. Hata ayıklayıcısı CREATE_PROCESS_DEBUG_EVENT işlenirken bu tanıtıcıyı kapatmalıdır. İşlemin ilk iş parçacığının tanıtıcısı, iş parçacığına THREAD_GET_CONTEXT, THREAD_SET_CONTEXT ve THREAD_SUSPEND_RESUME erişimine sahiptir. Hata ayıklayıcının iş parçacığına bu tür erişimi varsa, getThreadContextve SetThreadContextişlevlerinikullanarak iş parçacığının kayıtlarından okuyabilir ve yazabilir ve SuspendThread kullanarak iş parçacığını askıya alabilir ve sürdürebilir ve ResumeThreadişlevlerini. Sistem daha önce bir EXIT_PROCESS_DEBUG_EVENT olayı bildirmişse, hata ayıklayıcı ContinueDebugEvent işlevini çağırdığında sistem bu tanıtıcıyı kapatır. |
CREATE_THREAD_DEBUG_EVENT |
Hata ayıklanan bir işlemde yeni bir iş parçacığı oluşturulduğunda veya hata ayıklayıcı zaten etkin olan bir işlemde hata ayıklamaya başladığında oluşturulur. Bu hata ayıklama olayı, yeni iş parçacığı kullanıcı modunda yürütülmeye başlamadan önce oluşturulur. DEBUG_EVENT yapısı CREATE_THREAD_DEBUG_INFO bir yapı içerir. Bu yapı, yeni iş parçacığının tanıtıcısını ve iş parçacığının başlangıç adresini içerir. Tanıtıcının iş parçacığına THREAD_GET_CONTEXT, THREAD_SET_CONTEXT ve THREAD_SUSPEND_RESUME erişimi vardır. Hata ayıklayıcının iş parçacığına bu tür erişimi varsa, getThreadContextve SetThreadContextişlevlerinikullanarak iş parçacığının kayıtlarından okuyabilir ve yazabilir ve SuspendThread kullanarak iş parçacığını askıya alabilir ve sürdürebilir ve ResumeThreadişlevlerini. Sistem daha önce bir EXIT_THREAD_DEBUG_EVENT olayı bildirmişse, hata ayıklayıcı ContinueDebugEvent işlevini çağırdığında sistem tanıtıcıyı yeni iş parçacığına kapatır. |
EXCEPTION_DEBUG_EVENT |
Hata ayıklanan işlemde bir özel durum oluştuğunda oluşturulur. Olası özel durumlar, erişilemeyen belleğe erişmeyi denemeyi, kesme noktası yönergelerini yürütmeyi, sıfıra bölmeyi denemeyi veya Yapılandırılmış Özel Durum İşleme'nde belirtilen diğer özel durumları içerir. DEBUG_EVENT yapısı EXCEPTION_DEBUG_INFO bir yapı içerir. Bu yapı, hata ayıklama olayına neden olan özel durumu açıklar. Standart özel durum koşullarının yanı sıra, konsol işlemi hata ayıklaması sırasında ek bir özel durum kodu oluşabilir. CTRL+C, CTRL+C sinyallerini işleyen ve hata ayıklanan bir konsol işlemine giriş yapıldığında sistem bir DBG_CONTROL_C özel durum kodu oluşturur. Bu özel durum kodunun uygulamalar tarafından işlenmesi amaçlanmamıştır. Bir uygulama hiçbir zaman bununla başa çıkmak için bir özel durum işleyici kullanmamalıdır. Yalnızca hata ayıklayıcının yararına oluşturulur ve yalnızca konsol işlemine bir hata ayıklayıcı eklendiğinde kullanılır. Bir işlemde hata ayıklanmıyorsa veya hata ayıklayıcı DBG_CONTROL_C özel durumunu işlenmemiş olarak geçirirse (gn komutu aracılığıyla), SetConsoleCtrlHandler işlevi için belgelendiği gibi uygulamanın işleyici işlevleri listesinde arama yapılır. Hata ayıklayıcı DBG_CONTROL_C özel durumunu işlerse (gh komutu aracılığıyla), bir uygulama CTRL+C tuşlarını aşağıdaki gibi kodlar dışında fark etmez. while ((inputChar = getchar()) != EOF) ... Bu nedenle, hata ayıklayıcısı bu tür koddaki okuma beklemesinin sona ermesini durdurmak için kullanılamaz. |
EXIT_PROCESS_DEBUG_EVENT |
Hata ayıklanan bir işlemdeki son iş parçacığı her çıkışta oluşturulur. Bu hata ayıklama olayı, sistem işlemin DLL'lerini kaldırdıktan ve işlemin çıkış kodunu güncelleştirdikten hemen sonra gerçekleşir. DEBUG_EVENT yapısı, çıkış kodunu belirten bir EXIT_PROCESS_DEBUG_INFO yapısı içerir. Hata ayıklayıcı, bu hata ayıklama olayının alınmasıyla ilişkili tüm iç yapıları serbest bırakıyor. Sistem, hata ayıklayıcının tutamacını çıkış işlemine ve işlemin tüm iş parçacıklarına kapatır. Hata ayıklayıcısı bu tanıtıcıları kapatmamalıdır. İşlem kapatma işleminin çekirdek modu bölümü, bu olayı alan hata ayıklayıcı continueDebugEventçağırana kadar tamamlanamaz. O zamana kadar, işlem tanıtıcıları açık ve sanal adres alanı serbest bırakılmaz, böylece hata ayıklayıcı alt işlemi inceleyebilir. İşlem kapatma işleminin çekirdek modu bölümü tamamlandığında bildirim almak için, döndürülen tanıtıcıyı CREATE_PROCESS_DEBUG_EVENT ile çoğaltın, ContinueDebugEvent çağrısı yapın ve yinelenen işlem tanıtıcısının sinyal almasını bekleyin. |
EXIT_THREAD_DEBUG_EVENT |
Hata ayıklanan bir işlemin parçası olan bir iş parçacığı her çıkışta oluşturulur. Sistem, iş parçacığının çıkış kodunu güncelleştirdikten hemen sonra bu hata ayıklama olayını oluşturur. DEBUG_EVENT yapısı çıkış kodunu belirten bir EXIT_THREAD_DEBUG_INFO yapısı içerir. Bu hata ayıklama olayı, çıkış iş parçacığı bir işlemin son iş parçacığıysa gerçekleşmez. Bu durumda, bunun yerine EXIT_PROCESS_DEBUG_EVENT hata ayıklama olayı gerçekleşir. Hata ayıklayıcı, bu hata ayıklama olayının alınması üzerine iş parçacığıyla ilişkili tüm iç yapıları serbest bırakıyor. Sistem, hata ayıklayıcının tutamacını çıkış iş parçacığına kapatır. Hata ayıklayıcısı bu tanıtıcıyı kapatmamalıdır. |
LOAD_DLL_DEBUG_EVENT |
Hata ayıklanan bir işlem bir DLL yüklerken oluşturulur. Bu hata ayıklama olayı, sistem yükleyicisi bir DLL'ye bağlantıları çözümlediğinde veya hata ayıklanan işlem LoadLibrary işlevini kullandığında oluşur. Bu hata ayıklama olayı yalnızca sistem bir işlemin sanal adres alanına ilk kez dll ekleyişinde gerçekleşir. DEBUG_EVENT yapısı LOAD_DLL_DEBUG_INFO bir yapı içerir. Bu yapı, yeni yüklenen DLL'nin tanıtıcısını, DLL'nin temel adresini ve DLL'yi açıklayan diğer bilgileri içerir. Hata ayıklayıcısı, LOAD_DLL_DEBUG_EVENT işlenirken DLL tutamacını kapatmalıdır. Genellikle, hata ayıklayıcı bu hata ayıklama olayının alınması üzerine DLL ile ilişkilendirilmiş bir sembol tablosu yükler. |
OUTPUT_DEBUG_STRING_EVENT |
Hata ayıklanan bir işlem tarafından OutputDebugStringişlevini. DEBUG_EVENT yapısı OUTPUT_DEBUG_STRING_INFO bir yapı içerir. Bu yapı, hata ayıklama dizesinin adresini, uzunluğunu ve biçimini belirtir. |
UNLOAD_DLL_DEBUG_EVENT |
Hata ayıklanan bir işlem, FreeLibrary işlevini kullanarak DLL'yi kaldırır. Bu hata ayıklama olayı yalnızca bir DLL'nin işlemin adres alanından kaldırıldığında (yani DLL'nin kullanım sayısı sıfır olduğunda) oluşur. DEBUG_EVENT yapısı UNLOAD_DLL_DEBUG_INFO bir yapı içerir. Bu yapı, DLL'yi kaldıran işlemin adres alanında DLL'nin temel adresini belirtir. Genellikle, hata ayıklayıcı bu hata ayıklama olayını aldıktan sonra DLL ile ilişkilendirilmiş bir simge tablosunu kaldırır. Bir işlemden çıkıldığında, sistem işlemin DLL'lerini otomatik olarak kaldırır, ancak bir UNLOAD_DLL_DEBUG_EVENT hata ayıklama olayı oluşturmaz. |
RIP_EVENT |
Hata ayıklanan bir işlem sistem hata ayıklayıcı denetiminin dışında her öldüğünde oluşturulur. DEBUG_EVENT yapısı RIP_INFO bir yapı içerir. Bu yapı hata ve hata türünü belirtir. |