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);
}
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk