堆栈和转储日志记录

使用 /stacktraceonerror 和 /minidumponerror 开关

有两种方法可以从测试中捕获堆栈跟踪和小型转储。 最简单的是“onerror”模式。 运行测试时,请提供“/stacktraceonerror”和/或“/minidumponerror”开关。 然后,如果遇到故障,记录器将以默认格式为你捕获堆栈跟踪和/或小型转储。

捕获堆栈跟踪和小型转储的另一种方法是使用下面所述的 API。

使用 WexDebug.h 功能捕获堆栈跟踪和小型转储

WexDebug.h 提供用于捕获调用堆栈跟踪和小型转储的 API。

调用 SaveDump API 以保存小型转储。

此 API 采用可选的 DWORD 参数 (该参数是转储类型标志或标志组合) ,以及一个字符串引用,其中它将返回包含文件名和已保存转储文件路径的字符串。 文件名由 API 自动生成,基于当前日期和时间。

可选的转储类型参数指定所执行的小型转储应包含的内容。 它还指定是否将转储保存在 dmp 或 cab 文件中,以及对于 cab 文件,是否将符号与转储一起保存。 如果省略可选参数,则使用默认设置。

示例 (将转储连同其 pdbs 一起保存到驾驶室) :

NoThrowString savedDumpFilePath;
HRESULT hr = Debug::SaveDump(MiniDumpFormat::WriteCab | MiniDumpFormat::WriteCabSecondaryFiles, savedDumpFilePath);

请注意,将转储保存到 cab 文件中所需的时间比保存普通转储要长;附加符号文件所需的时间甚至更长。

调用 GetStack API 以获取调用堆栈跟踪。

此 API 采用可选的 DWORD 参数 (这是一个类型标志或标志组合) ,以及一个字符串引用,其中它返回一个字符串,其中包含当前上下文的调用堆栈跟踪。

可选的堆栈类型参数指定堆栈跟踪应包含的内容。 如果省略可选参数,则使用默认设置。

例如:

NoThrowString stackText;
HRESULT hr = Debug::GetStack(CallStackFormat::ColumnNames | CallStackFormat::FrameAddress |
                             CallStackFormat::SourceLine, stackText);

堆栈选项标志与调试器命令的关联。 如果使用 windbg 系列调试器,以下近似关联列表可能会派上用场:

调试器语法 相应的标志
k CallStackFormat::ColumnNames
K v k + CallStackFormat::FunctionInfo
kp / kP k + CallStackFormat::P arameters
kn k + CallStackFormat::FrameNumbers
Kf k + CallStackFormat::FrameMemoryUsage

技术参考

如果对转储和堆栈可选参数的详细信息感兴趣,请参阅 Windows 调试工具随附的文档。 有关“转储标志”的文档,请参阅 DEBUG_FORMAT_XXX。 有关“堆栈标志”的文档,请参阅 OutputStackTrace