为什么我会从SymInitialize收到虚假错误消息?

时间:2020-09-11 01:14:03

标签: c++ windows dbghelp

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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