信息结构的文档没有解释如何确定它所指向的字符串值的长度(或大小)。具体来说,nDebugStringLength的文档令人困惑:
字符串长度的下16位(以字节为单位)。由于nDebugStringLength的类型为WORD,所以这并不总是包含字符串的完整长度(以字节为单位)。 例如,如果原始输出字符串大于65536字节,则此字段将包含一个小于实际字符串长度(以字节为单位)的值。
据我所知,真正的大小可以是方程的任何一个解的值:
size = nDebugStringLength + (n * 65536)
对于n中的任何[0..65536)。
问题:
如何确定字符串的正确大小?除非我忽略了一些东西,否则文档在这方面似乎是不够的。
发布于 2021-01-15 17:48:28
最初,调试事件以DBGUI_WAIT_STATE_CHANGE形式出现。
如果使用WaitForDebugEvent[Ex] api -它在内部使用DbgUiConvertStateChangeStructure[Ex]将DBGUI_WAIT_STATE_CHANGE转换为DEBUG_EVENT。
DbgExceptionStateChang (in NewState)事件与DBG_PRINTEXCEPTION_WIDE_C和DBG_PRINTEXCEPTION_C (在ExceptionCode中)转换为OUTPUT_DEBUG_STRING_INFO。Exception.ExceptionRecord.ExceptionInformation或ExceptionInformation3 (万一DBG_PRINTEXCEPTION_C和api版本没有Ex )都使用了nDebugStringLength。但是由于nDebugStringLength只有16位长,所以当原始值为32/64位长时,它只使用低16位的ExceptionInformation (或3)。请注意,ExceptionInformation (在DBG_PRINTEXCEPTION_WIDE_C情况下为3)包含字符中的字符串长度,包括终止于0的。相反,nDebugStringLength以字节为单位(如果我们使用WaitForDebugEventEx和DBG_PRINTEXCEPTION_WIDE_C异常- nDebugStringLength = (WORD)(ExceptionInformation[0] * sizeof(WCHAR)) )
https://stackoverflow.com/questions/65736037
复制相似问题