我已经在转储中嵌入了一个自定义流(例如,将UserStreamParam参数传递给MiniDumpWriteDump函数)。现在,我尝试从WinDbg扩展中提取流。(注意,我已经验证了可以使用MiniDumpReadDumpStream函数检索流)。
我正在使用IDebugAdvanced2::Request方法和DEBUG_REQUEST_READ_USER_MINIDUMP_STREAM请求。我能够从标准流中检索数据。例如,下面的代码片段将正确检索misc info流的内容。
DEBUG_READ_USER_MINIDUMP_STREAM rums = {};
rums.StreamType = MiscInfoStream;
rums.Buffer = &buf;
rums.BufferSize = sizeof buf;
hr = p->Request(DEBUG_REQUEST_READ_USER_MINIDUMP_STREAM,
&rums, sizeof rums, 0, 0, 0);
但是,尝试检索自己的流将导致错误(0x80070570,ERROR_FILE_CORRUPT)和WinDbg输出
Dir entry 11, ??? stream has unknown stream type 6381921
请注意,.dumpdebug
输出中也显示了相同的消息。
Stream 11: type ??? (6381921), size 00000038, RVA 00033FA9
Dir entry 11, ??? stream has unknown stream type 6381921
问题是什么?我如何检索我的用户流的内容?
3条答案
按热度按时间6za6bjd01#
很晚才答复
StreamType cannot be UserDefined
流类型jen-lung chiu of ms
张贴,所以在osronline windbg列表很久以前我不知道最新的dbgeng是否消除了此限制
您可以使用dbghelp函数独立检索它
(不推荐在windbg扩展中使用dbgelp函数)
或者自己用fopen()fread()解析流,如下所示
包含userStreams的用户转储的输出
(
oleg staradumov debuginfo.com writeuserstream.cpp
)1zmg4dgp2#
即使没有经过测试,如果您使用自定义值(大于LastReservedStream = 0xFFFF)而不是MiscInfoStream填充StreamType,它也应该可以工作。
cig3rfwq3#
我在寻找从dbg文件中读出用户流的方法时发现了这个主题。
Blabb的回答基本正确,对我帮助很大,但它有两个缺陷:
1.您应该使用MINIDUMP_HEADER.StreamDirectoryRva来查找MINIDUMP_DIRECTORY列表。
1.您不应该将MINIDUMP_DIRECTORY条目转换为MINIDUMP_USER_STREAM,因为这是一个错误(MINIDUMP_USER_STREAM是一个比MINIDUMP_DIRECTORY大的结构体,因此您在那里阅读的是未初始化的内存)。使用MINIDUMP_DIRECTORY来定位流中所需的部分。