Bagikan melalui


Mengambil Informasi Simbol berdasarkan Alamat

Kode berikut menunjukkan cara memanggil fungsi SymFromAddr. 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, dwAddress adalah alamat yang akan dipetakan ke simbol. Fungsi SymFromAddr akan menyimpan offset ke awal simbol ke alamat di dwDisplacement. Contoh mengasumsikan Anda telah menginisialisasi handler simbol menggunakan kode dalam Menginisialisasi Penangan Simbol.

DWORD64  dwDisplacement = 0;
DWORD64  dwAddress = SOME_ADDRESS;

char buffer[sizeof(SYMBOL_INFO) + MAX_SYM_NAME * sizeof(TCHAR)];
PSYMBOL_INFO pSymbol = (PSYMBOL_INFO)buffer;

pSymbol->SizeOfStruct = sizeof(SYMBOL_INFO);
pSymbol->MaxNameLen = MAX_SYM_NAME;

if (SymFromAddr(hProcess, dwAddress, &dwDisplacement, pSymbol))
{
    // SymFromAddr returned success
}
else
{
    // SymFromAddr failed
    DWORD error = GetLastError();
    printf("SymFromAddr returned error : %d\n", error);
}

Untuk mengambil nomor baris kode sumber untuk alamat tertentu, aplikasi dapat menggunakan SymGetLineFromAddr64. Fungsi ini memerlukan penunjuk ke struktur IMAGEHLP_LINE64 untuk menerima nama file sumber dan nomor baris yang sesuai dengan alamat kode tertentu. Perhatikan bahwa handler simbol hanya dapat mengambil informasi nomor baris saat SYMOPT_LOAD_LINES diatur menggunakan fungsi SymSetOptions. Opsi ini harus diatur sebelum memuat modul. Parameter dwAddress berisi alamat kode tempat nama file sumber dan nomor baris akan berada.

DWORD64  dwAddress;
DWORD  dwDisplacement;
IMAGEHLP_LINE64 line;

SymSetOptions(SYMOPT_LOAD_LINES);

line.SizeOfStruct = sizeof(IMAGEHLP_LINE64);
dwAddress = 0x1000000; // Address you want to check on.

if (SymGetLineFromAddr64(hProcess, dwAddress, &dwDisplacement, &line))
{
    // SymGetLineFromAddr64 returned success
}
else
{
    // SymGetLineFromAddr64 failed
    DWORD error = GetLastError();
    _tprintf(TEXT("SymGetLineFromAddr64 returned error : %d\n"), error);
}