【问题标题】:Why am I getting a spurious error message from SymInitialize?为什么我会收到来自 SymInitialize 的虚假错误消息?
【发布时间】:2020-09-11 01:14:03
【问题描述】:

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

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

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

【问题讨论】:

  • 你为什么要收集堆栈跟踪?只需设置 Windows 错误报告并在出现未处理的异常时获取 real 小型转储。或者,如果您想收集错误条件之外的转储,请致电 MiniDumpWriteDump。额外的好处:您不必发送调试符号。

标签: c++ windows dbghelp


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-30
    • 2019-09-17
    相关资源
    最近更新 更多