Bagikan melalui


Mengambil Informasi Simbol berdasarkan Nama

Kode berikut menunjukkan cara memanggil fungsi SymFromName. Fungsi ini mengisi struktur SYMBOL_INFO. Karena panjangnya variabel, Anda harus menyediakan buffer yang cukup besar untuk menahan nama yang disimpan di akhir struktur SYMBOL_INFO . Selain itu , anggota MaxNameLen harus diatur ke jumlah byte yang dicadangkan untuk nama tersebut. Dalam contoh ini, szSymbolName adalah buffer yang menyimpan nama simbol yang diminta. Contoh mengasumsikan Anda telah menginisialisasi handler simbol menggunakan kode dalam Menginisialisasi Penangan Simbol.

TCHAR szSymbolName[MAX_SYM_NAME];
ULONG64 buffer[(sizeof(SYMBOL_INFO) +
    MAX_SYM_NAME * sizeof(TCHAR) +
    sizeof(ULONG64) - 1) /
    sizeof(ULONG64)];
PSYMBOL_INFO pSymbol = (PSYMBOL_INFO)buffer;

_tcscpy_s(szSymbolName, MAX_SYM_NAME, TEXT("WinMain"));
pSymbol->SizeOfStruct = sizeof(SYMBOL_INFO);
pSymbol->MaxNameLen = MAX_SYM_NAME;

if (SymFromName(hProcess, szSymbolName, pSymbol))
{
    // SymFromName returned success
}
else
{
    // SymFromName failed
    DWORD error = GetLastError();
    _tprintf(TEXT("SymFromName returned error : %d\n"), error);
}

Jika aplikasi memiliki modul atau nama file sumber serta informasi nomor baris, aplikasi dapat menggunakan SymGetLineFromName64 untuk mengambil alamat kode virtual. Fungsi ini memerlukan penunjuk ke struktur IMAGEHLP_LINE64 untuk menerima alamat kode virtual. Perhatikan bahwa handler simbol hanya dapat mengambil informasi nomor baris saat opsi SYMOPT_LOAD_LINES diatur menggunakan fungsi SymSetOptions. Opsi ini harus diatur sebelum memuat modul. Parameter szModuleName berisi nama modul sumber; bersifat opsional dan dapat berupa NULL. Parameter szFileName harus berisi nama file sumber, dan parameter dwLineNumber harus berisi nomor baris tempat alamat virtual akan diambil.

TCHAR  szModuleName[MAX_PATH];
TCHAR  szFileName[MAX_PATH];
DWORD  dwLineNumber;
LONG   lDisplacement;
IMAGEHLP_LINE64 line;

SymSetOptions(SYMOPT_LOAD_LINES);

line.SizeOfStruct = sizeof(IMAGEHLP_LINE64);
_tcscpy_s(szModuleName, MAX_PATH, TEXT("MyApp"));
_tcscpy_s(szFileName, MAX_PATH, TEXT("main.c"));
dwLineNumber = 248;

if (SymGetLineFromName64(hProcess, szModuleName, szFileName,
    dwLineNumber, &lDisplacement, &line))
{
    // SymGetLineFromName64 returned success
}
else
{
    // SymGetLineFromName64 failed
    DWORD error = GetLastError();
    _tprintf(TEXT("SymGetLineFromName64 returned error : %d\n"), error);
}