0

Symbols サービスを構築しています。構造体変数とそのオフセットを出力できるようにしたいと考えています。必要な pdb をロードし、指定されたマスクに適合する構造体を見つけようとしています。たとえば、 struct に関する詳細を取得したいとします_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")

では、構造体のシンボルを取得するにはどうすればよいですか?

ありがとう!

4

1 に答える 1

1

コンパイル前のフォルダの内容

:\>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
于 2015-09-10T05:04:22.387 に答える