Я строю сервис Symbols и хочу иметь возможность печатать переменные структуры и их смещения. Я загружаю необходимый pdb и пытаюсь найти структуру, которая соответствует заданной маске. Например, я хочу получить подробную информацию о структуре _RTL_CRITICAL_SECTION
,
При использовании windbg
Я использую команду dt MSVCP120!_RTL_CRITICAL_SECTION
и я получаю информацию о структуре (именно то, что я хочу). Но, когда я ищу символ, используя мой код:
SymEnumSymbols(GetCurrentProcess(), base_addr,"MSVCP120!_RTL_CRITICAL_SECTION", enum_symbols_callback, NULL);
BOOL CALLBACK symbol_processor::enum_symbols_callback(PSYMBOL_INFO pSymInfo, ULONG SymbolSize, PVOID UserContext)
{
printf("Name = %s\n", pSymInfo->Name);
return TRUE;
}
Ничего не печатается .. Значит, нет соответствия маске ..
Это работает, когда маска является функцией (например, "MSVCP120!std::tr2::sys::_Open_dir"
)
Итак, как мне получить символ структуры ..?
Спасибо!
содержимое папки до компиляции
:\>ls -l
-rw-rw-rw- 1 Admin 0 459 2015-09-10 10:23 structshow.cpp
источник
:\>cat structshow.cpp
#include <windows.h>
#include <dbghelp.h>
#include <stdio.h>
#pragma comment (lib,"dbghelp.lib")
BOOL CALLBACK mycallback(PSYMBOL_INFO pSymInfo,ULONG,PVOID){
printf("%s\n",pSymInfo->Name);
return true;
}
int main(){
HMODULE hmod = LoadLibraryA("c:\\windows\\system32\\ntdll.dll");
HANDLE hproc = GetCurrentProcess();
SymInitialize(hproc,"F:\\symbols",TRUE);
SymEnumTypesByName(hproc,(ULONG64)hmod,"*!_R*",mycallback,0);
return 0;
}
компилировать используя
:\>..\compile.bat
:\>if "C:\Program Files\Microsoft Visual Studio 10.0\VC\" == "" ()
:\>cl /Zi /EHsc /nologo /W4 /analyze *.cpp /link /RELEASE structshow.cpp
:\>ls -l
содержимое папки после компиляции
-rw-rw-rw- 1 Admin 0 459 2015-09-10 10:23 structshow.cpp
-rwxrwxrwx 1 Admin 0 89088 2015-09-10 10:29 structshow.exe
-rw-rw-rw- 1 Admin 0 21081 2015-09-10 10:29 structshow.obj
-rw-rw-rw- 1 Admin 0 1002496 2015-09-10 10:29 structshow.pdb
-rw-rw-rw- 1 Admin 0 94208 2015-09-10 10:29 vc100.pdb
использовать последний dbghelp.dll
:\>copy xxxx\dbghelp.dll .
1 file(s) copied.
:\>echo "do not use system dbghelp.dll it is
outdated SymbolEnumTypesbyName is available in
dbghelp version 6.8 and above only "
выполнить скомпилированный двоичный файл
:\>structshow.exe
_RTL_USER_PROCESS_PARAMETERS
_RTL_CRITICAL_SECTION <----------------------
_RTL_STACK_TRACE_ENTRY
_RTL_TRACE_BLOCK
_RTL_CRITICAL_SECTION_DEBUG
_RTL_DRIVE_LETTER_CURDIR
_RTL_TRACE_DATABASE
_RTL_TRACE_SEGMENT