符号加载

调用 SymInitialize 函数且 fInvadeProcess 参数设置为 TRUE 时,或者调用 SymLoadModuleEx 函数以指定模块时,符号处理程序将加载符号。 在任一情况下,符号处理程序都会加载符号或延迟符号加载,直到请求符号,具体取决于 SymSetOptions 函数设置的选项。

符号处理程序可用于检索任何模块的符号信息;它不需要与 SymInitialize 调用中指定的进程相关联。 若要使用任意模块,请在 ImageName 参数中指定模块映像的完整路径。 可以使用具有调试信息(.exe、.dll、.drv、.sys、.scr、.cpl 或 .com)的任何可执行模块的路径。 使用 BaseOfDll 参数指定任何加载地址,然后符号地址将基于该地址。

在应用程序的整个持续时间内,可能不需要保持加载符号模块。 若要从符号处理程序的模块列表中释放符号模块,请使用 SymUnloadModule64 函数。 此函数释放为符号模块分配的内存。 若要再次使用该模块的符号,必须调用 SymLoadModuleEx 函数,即使设置了符号延迟加载选项也是如此。

诊断符号加载问题

若要查看所有尝试加载符号,请使用 SYMOPT_DEBUG 调用 SymSetOptions。 这会导致 DbgHelp 调用 OutputDebugString 函数,其中包含有关符号搜索的详细信息,例如它正在搜索的目录和错误消息。 如果代码使用 SymRegisterCallback64,DbgHelp 将调用回调函数,而不是调用 OutputDebugStringActionCode 参数设置为 CBA_DEBUG_INFO 且 CallbackData 参数是可以显示的字符串。

若要在不更改源代码的情况下将此调试输出显示到控制台,请在调用 SymInitialize 函数之前将 DBGHELP_DBGOUT 环境变量设置为非 NULL 值。 若要将信息记录到文件中,请将 DBGHELP_LOG 环境变量设置为要使用的日志文件的名称。

请注意,仅在需要时才应使用这些功能。 它们可能会减慢包含许多符号的模块的符号加载速度。