Aracılığıyla paylaş


Bildirim Alma

Aşağıdaki kodda, modüllerin ve ilgili sembol dosyalarının aranıp yüklenmesiyle ilgili sembol işleyicisinden ayrıntılı durum bilgilerinin nasıl alınıp raporlanması gösterilmektedir.

WinDbg hata ayıklayıcısını bilenlerin çoğu "!sym noisy" adlı bir komutu hatırlayabilir. Bu komut kullanıcı tarafından WinDbg'nin sembol dosyalarını neden yükleyemeyeceğini belirlemek için kullanılır. Sembol işleyicisinin denediği her şeyin ayrıntılı bir listesini gösterir.

Aynı liste, DbgHelp sembol işleyicisine istemci geliştiren herkes tarafından da kullanılabilir.

İlk olarak, SymSetOptions'ı, SYMOPT_DEBUGile çağırın. Bu, DbgHelp'in hata ayıklama bildirimlerini açmasına neden olur.

SymInitializeçağrısı yaptıktan sonra, dbgHelp'in ilginç bir olay gerçekleştiğinde çağıracağı bir geri çağırma işlevini kaydetmek için SymRegisterCallback64 kullanın. Bu örnekte geri çağırma işlevi, SymRegisterCallbackProc64olarak adlandırılır. Sembol geri çağırma işlevlerine, türe göre işleyebilecekleri eylem kodları çeşitlemesi geçirilir. Bu örnekte yalnızca CBA_EVENT eylem kodunu işleyeceğiz. Bu işlev, sembol yükleme işleminde gerçekleşen bir olay hakkında ayrıntılı bilgiler içeren bir dize geçirir. Bu olay, yürütülebilir görüntüdeki verileri okuma girişiminden sembol dosyasının başarılı konumuna kadar her şey olabilir. SymRegisterCallbackProc64 bu dizeyi görüntüler ve TRUE döndürür.

Önemli

İşlemediğiniz her eylem koduna FALSE döndürdüğünüzden emin olun; aksi takdirde tanımsız davranışlarla karşılaşabilirsiniz. Tüm eylem kodlarının ve bunların etkilerinin listesi için SymRegisterCallbackProc64 bakın.

 

Geri çağırma kaydedildiği için, SymLoadModuleExçağırarak komut satırında belirtilen modülü yüklemenin zamanı geldi.

Son olarak, çıkmadan önce SymCleanup arayın.

#include <windows.h>
#include <stdio.h>
#include <tchar.h>

#ifdef UNICODE
 #define DBGHELP_TRANSLATE_TCHAR
#endif
#include <dbghelp.h>

// Here is an implementation of a Symbol Callback function.

BOOL 
CALLBACK 
SymRegisterCallbackProc64(
    __in HANDLE hProcess,
    __in ULONG ActionCode,
    __in_opt ULONG64 CallbackData,
    __in_opt ULONG64 UserContext
    )
{
    UNREFERENCED_PARAMETER(hProcess);
    UNREFERENCED_PARAMETER(UserContext);
    
    PIMAGEHLP_CBA_EVENT evt;

    // If SYMOPT_DEBUG is set, then the symbol handler will pass
    // verbose information on its attempt to load symbols.
    // This information be delivered as text strings.
    
    switch (ActionCode)
    {
    case CBA_EVENT:
        evt = (PIMAGEHLP_CBA_EVENT)CallbackData;
        _tprintf(_T("%s"), (PTSTR)evt->desc);
        break;

    // CBA_DEBUG_INFO is the old ActionCode for symbol spew.
    // It still works, but we use CBA_EVENT in this example.
#if 0
    case CBA_DEBUG_INFO:
        _tprintf(_T("%s"), (PTSTR)CallbackData);
        break;
#endif

    default:
        // Return false to any ActionCode we don't handle
        // or we could generate some undesirable behavior.
        return FALSE;
    }

    return TRUE;
}

// Main code.

int __cdecl
#ifdef UNICODE
_tmain(
#else
main(
#endif
    __in int argc,
    __in_ecount(argc) PCTSTR argv[]
    )
{
    BOOL status;
    int rc = -1;
    HANDLE hProcess;
    DWORD64 module;
    
    if (argc < 2)
    {
        _tprintf(_T("You must specify an executable image to load.\n"));
        return rc;
    }

    // If we want to se debug spew, we need to set this option.
        
    SymSetOptions(SYMOPT_DEBUG);
    
    // We are not debugging an actual process, so lets use a placeholder
    // value of 1 for hProcess just to ID these calls from any other
    // series we may want to load.  For this simple case, anything will do.
    
    hProcess = (HANDLE)1;
    
    // Initialize the symbol handler.  No symbol path.  
    // Just let dbghelp use _NT_SYMBOL_PATH
    
    status = SymInitialize(hProcess, NULL, false);
    if (!status)
    {
        _tprintf(_T("Error 0x%x calling SymInitialize.\n"), GetLastError());
        return rc;
    }
     
    // Now register our callback.
    
    status = SymRegisterCallback64(hProcess, SymRegisterCallbackProc64, NULL);
    if (!status)
    {
        _tprintf(_T("Error 0x%x calling SymRegisterCallback64.\n"), GetLastError());
        goto cleanup;
    }
    
    // Go ahead and load a module for testing.
    
    module = SymLoadModuleEx(hProcess,  // our unique id
                             NULL,      // no open file handle to image
                             argv[1],   // name of image to load
                             NULL,      // no module name - dbghelp will get it
                             0,         // no base address - dbghelp will get it
                             0,         // no module size - dbghelp will get it
                             NULL,      // no special MODLOAD_DATA structure
                             0);        // flags
    if (!module)
    {
        _tprintf(_T("Error 0x%x calling SymLoadModuleEx.\n"), GetLastError());
        goto cleanup;
    }
    rc = 0;
    
cleanup:
    SymCleanup(hProcess);
    
    return rc;    
}

SymInitialize'in ikinci parametresi olarak NULL belirtilmesi, sembol işleyicisinin sembol dosyalarını bulmak için varsayılan arama yolunu kullanması gerektiğini gösterir. Sembol işleyicisinin sembol dosyalarını nasıl bulabildiği veya bir uygulamanın sembol arama yolunu nasıl belirtebileceği hakkında ayrıntılı bilgi için bkz. Sembol Yolları.

Bu programı çalıştırmak, sembol yolunun nasıl işlendiğini gösterir. DbgHelp, sembol dosyasını bulmak için sembol yolunu ararken, SymRegisterCallbackProc64sürekli olarak çağırır ve bu da DbgHelp tarafından geçirilen aşağıdaki dizeleri görüntüler.

d:\load.exe c:\home\dbghelp.dll
DBGHELP: No header for c:\home\dbghelp.dll.  Searching for image on disk
DBGHELP: c:\home\dbghelp.dll - OK
DBGHELP: .\dbghelp.pdb - file not found
DBGHELP: .\dll\dbghelp.pdb - file not found
DBGHELP: .\symbols\dll\dbghelp.pdb - file not found
DBGHELP: .\symbols\dll\dbghelp.pdb - file not found
DBGHELP: cache*c:\symbols\dbghelp.pdb - file not found
DBGHELP: cache*c:\symbols\dll\dbghelp.pdb - file not found
DBGHELP: cache*c:\symbols\symbols\dll\dbghelp.pdb - file not found
DBGHELP: d:\nt.binaries.amd64chk\symbols.pri\dbg\dbghelp.pdb - file not found
DBGHELP: dbghelp - private symbols & lines
         dbghelp.pdb