堆栈和转储日志记录
使用 /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。