DbgHelp教程1——初始化

以下是初始化DbgHelp最简单的代码:

#include <windows.h>
#include <dbghelp.h>
#include <iostream>
#include <string>
#include <tchar.h>

using namespace std;

#pragma comment(lib, "dbghelp.lib")

int _tmain(int argc, _TCHAR *argv[]) {

  DWORD options = SYMOPT_UNDNAME | SYMOPT_DEFERRED_LOADS | SYMOPT_LOAD_LINES;
  SymSetOptions(options);

  std::string path =
      R"(SRV*E:\symbols*https://msdl.microsoft.com/download/symbols)";
  BOOL result = SymInitialize(GetCurrentProcess(), path.c_str(), TRUE);
  if (!result) {
    DWORD error = GetLastError();
    cout << "SymInitialize returned error : " << error << endl;
  }

  result = ::SymCleanup(GetCurrentProcess());

  system("pause");
  return 0;
}

SymSetOptions函数是设置DbgHelper的功能选项,具体用法见https://msdn.microsoft.com/en-us/library/windows/desktop/ms681366(v=vs.85).aspx。

SymSetOptions参数为0的时候,表示所有的选项都关闭,一下是常见的选项解释:

可以在运行的时候多次调用SymSetOptions来修改选项,也可以用SymGetOptions来获取当前选项。

注意:所有的DbgHelp函数都是单线程的,因此不能在多个线程中调用,否则会导致不可预知的异常。

SymInitialize函数是正在的初始化DbgHelp库,它的原型如下:

BOOL WINAPI SymInitialize(
  _In_     HANDLE hProcess,
  _In_opt_ PCTSTR UserSearchPath,
  _In_     BOOL   fInvadeProcess
);