Проблема с трассировкой стека C ++

Я работаю над классом, который я хотел бы использовать для регистрации текущего стека вызовов на компьютерах с Windows Vista / 7. (Очень похоже на «Обход стека вызовов» http: //www.codeproject.ru / Articles / 11132 / Walking-the-callstack ).

Сначала я использовал RtlCaptureContext для получения текущей записи контекста, затем я использовал StackWalk64 для получения отдельных кадров стека. Теперь я понял, что счетчик программ в STACKFRAME64.AddrPC на самом деле изменяется для определенной строки кода всякий раз, когда я закрываю свою программу и запускаю ее снова. По какой-то причине я подумал, что PC-Address для конкретной строки кода останется прежним, пока я не изменю исходный код и не перекомпилирую его снова.

Мне нужен PC-Address для использования SymFromAddr и SymGetLineFromAddr64 для получения информации о вызываемой функции, файле кода и номере строки. К сожалению, это работает только до тех пор, пока есть Program-Debug-Database (PDB-File), но мне не разрешено предоставлять это клиенту.

Мой план состоял в том, чтобы записать адреса ПК в стеке вызовов (всякий раз, когда это необходимо), а затем отправить их мне от клиента. Чтобы я мог использовать свои PDB-файлы, чтобы узнать, какие функции были вызваны, но это, конечно, работает только в том случае, если адреса ПК являются уникальными идентификаторами. Поскольку они меняются каждый раз, когда я запускаю программу, я не могу использовать этот подход.

Знаете ли вы, как лучше прочитать стек вызовов или решить проблему с изменением счетчика программ?

Я думаю, что одним из возможных решений могло бы быть всегда получать адрес компьютера известного местоположения и использовать его как ссылка для определения только смещения между разными адресами ПК. Кажется, это работает, но я не уверен, что это действительный метод и всегда будет работать.

Большое спасибо за вашу помощь! Я опубликую окончательное (инкапсулированное) решение на codeproject.com и, ЕСЛИ ВАМ НРАВИТСЯ, скажу, что вы мне помогли.

6
задан user667967 24 February 2012 в 02:36
поделиться