0

在编写 C++ Windows 应用程序时,我使用SymInitializeW来初始化符号以获取回溯。正如文档所述,我正在检查返回代码,然后在 SymInitializeW 返回 false 时使用GetLastError 和 FormatMessage (如示例中所示)。

但是,当我这样做时,我收到“传递给系统调用的数据区域太小”的错误消息。我不确定那指的是什么,因为实际上没有传递“数据区域”——只有进程句柄、搜索路径的 PCWSTR 和布尔值。-- 看起来符号加载有效,这让人倍感困惑。(例如,如果我跳过错误处理,事情似乎工作正常。)

此消息是否指向我实际上做错的事情,还是虚假的?如果是虚假的,为什么 SymInitializeW 返回 false?

4

1 回答 1

0

SymInitialize 函数只能在给定的进程句柄上调用一次。如果有任何代码路径可以多次调用 SymInitialize 函数,您可能会收到奇怪的错误,例如“传递给系统调用的数据区域太小”(ERROR_INSUFFICIENT_BUFFER,122(0x7A))或“参数不正确” (ERROR_INVALID_PARAMETER 87 (0x57)) 以及可能来自 GetLastError 的其他人,尽管您根据文档使用了所有正确的参数。(不一定有特定的“不要调用 SymInitialize 两次”错误。)

最佳实践是确保通过符号处理函数的控制流清晰,并且在顶部调用 SymInitialize 一次且仅一次,然后在退出正在执行符号处理的函数之前在进程句柄上调用SymCleanup 。如果您正确调用了 SymCleanup,则对 SymInitialize 的后续调用应该会成功。

于 2020-09-11T01:14:03.473 回答