SymFromAddr возвращает «Указанный модуль не найден». - PullRequest
1 голос
/ 20 ноября 2010

Я пытаюсь получить символы из адресов, полученных из моего стека, но SymFromAddr продолжает сбой с системной ошибкой 126 (указанный модуль не может быть найден). Я инициализирую символизирующую вещь с помощью

SymInitialize(m_processHandle, NULL, TRUE);

(последний параметр == true ==> Автоматически загружает PDB)

и я использую SymFromAddr следующим образом:

SYMBOL_INFO_PACKAGE sym = { sizeof(sym) };
sym.si.MaxNameLen = MAX_SYM_NAME; 
DWORD64 displacement = 0;
bool ok = SymFromAddr(m_processHandle, address, &displacement, &sym.si);

Код на C ++ для Windows. и файл PDB находится в каталоге EXE! Что я делаю неправильно? спасибо:)

1 Ответ

1 голос
/ 23 декабря 2010

SymFromAddr немного капризный.

  1. Если между SymInitialize и SymFromAddr возникает какая-либо LoadLibrary, она может не работать. Если SymFromAddr, вы можете снова выполнить SymInitialize (подсказка: вы можете кэшировать адрес, чтобы избежать большого количества SymInitialize, которое является огромным потребителем ЦП)
  2. 64-битная реализация SymFromAddr (т. Е. SymFromAddr64) работает лучше
  3. Если код не оптимизирован, он будет работать лучше
  4. Pdb, сгенерированный VC9, работает лучше, чем старая версия.

Вы можете найти некоторую идею в следующем коде http://code.google.com/p/nprof/source/browse/0.11/Hook/StackWalker.cpp?r=281

...