首页 > 解决方案 > 如何确定 OUTPUT_DEBUG_STRING_INFO 中字符串的长度?

问题描述

OUTPUT_DEBUG_STRING_INFO结构的文档没有解释如何确定它指向的字符串值的长度(或大小)。具体来说,文档nDebugStringLength令人困惑:

字符串长度的低 16 位(以字节为单位)。由于 nDebugStringLength 是 WORD 类型,因此它并不总是包含字符串的完整长度(以字节为单位)。

例如,如果原始输出字符串长于 65536 字节,则该字段将包含一个小于实际字符串长度(以字节为单位)的值。

据我了解,真实大小可以是方程解的任何值:

size = nDebugStringLength + (n * 65536)

对于任何n[0..65536).

问题:

如何确定字符串的正确大小?除非我忽略了某些东西,否则文档在这方面似乎是不够的。

标签: winapi

解决方案


最初调试事件的形式是DBGUI_WAIT_STATE_CHANGE

如果使用WaitForDebugEvent[Ex]api - 它通过使用在内部转换DBGUI_WAIT_STATE_CHANGEDEBUG_EVENTDbgUiConvertStateChangeStructure[Ex]

DbgExceptionStateChang(在NewState)事件与DBG_PRINTEXCEPTION_WIDE_CDBG_PRINTEXCEPTION_CExceptionCode中)转换为OUTPUT_DEBUG_STRING_INFO. nDebugStringLength取自Exception.ExceptionRecord.ExceptionInformation[0]ExceptionInformation[3] (如果没有Ex的情况DBG_PRINTEXCEPTION_C和 api 版本)。但是因为nDebugStringLength只有 16 位长度,所以当原始值为 32/64 位长度时 - 它被截断 - 仅使用ExceptionInformation[0](或[3])的低 16 位。请注意ExceptionInformation[0](和[3]以防万一DBG_PRINTEXCEPTION_WIDE_C) 包含以字符为单位的字符串长度,包括以 0 结尾。相比之下,以字节为单位的nDebugStringLength(如果我们使用WaitForDebugEventExDBG_PRINTEXCEPTION_WIDE_C异常 -nDebugStringLength = (WORD)(ExceptionInformation[0] * sizeof(WCHAR))


推荐阅读