0

所有这些 API(DbgHelp、DbgEng、DIA SDK)都可用于从函数指针中恢复函数名称/源文件位置,因此可用于解密堆栈跟踪。

但是,每个 DbgHelp 函数都有以下注释:

所有 DbgHelp 函数,例如这个函数,都是单线程的。因此,从多个线程调用此函数可能会导致意外行为或内存损坏。为避免这种情况,您必须将来自多个线程的所有并发调用同步到该函数。

至于 DbgEng,没有这样的声明,但是它似乎是基于 DbgHelp,所以不能是线程安全的:即使 DbgEng 保护对 DbgHelp 的每次调用,也可能不是来自 DbgEng 的对 DbgHelp 的调用,而是直接来自用户的代码。

恐怕 DIA SDK 也是使用 DbgHelp 实现的。

那么是否有任何健壮的符号 API 可用于为多线程应用程序设计的库中?

4

1 回答 1

0

DIA SDK 被认为是一个线程安全的解决方案。

Boost.Stacktrace 存储库中有一个问题,要求切换到 DIA SDK。那里提到了 DbgHelp 和 DbgEng 的不安全性。

还有一个选项来滚动自己的实现;一个可能的起点在这里:https ://github.com/microsoft/microsoft-pdb

于 2022-02-17T14:19:46.940 回答