winapi - 如何确定 OUTPUT_DEBUG_STRING_INFO 中字符串的长度?
问题描述
OUTPUT_DEBUG_STRING_INFO结构的文档没有解释如何确定它指向的字符串值的长度(或大小)。具体来说,文档nDebugStringLength
令人困惑:
字符串长度的低 16 位(以字节为单位)。由于 nDebugStringLength 是 WORD 类型,因此它并不总是包含字符串的完整长度(以字节为单位)。
例如,如果原始输出字符串长于 65536 字节,则该字段将包含一个小于实际字符串长度(以字节为单位)的值。
据我了解,真实大小可以是方程解的任何值:
size = nDebugStringLength + (n * 65536)
对于任何n
在[0..65536)
.
问题:
如何确定字符串的正确大小?除非我忽略了某些东西,否则文档在这方面似乎是不够的。
解决方案
最初调试事件的形式是DBGUI_WAIT_STATE_CHANGE
如果使用WaitForDebugEvent[Ex]
api - 它通过使用在内部转换DBGUI_WAIT_STATE_CHANGE
为DEBUG_EVENT
DbgUiConvertStateChangeStructure[Ex]
DbgExceptionStateChang(在NewState中)事件与DBG_PRINTEXCEPTION_WIDE_C
(DBG_PRINTEXCEPTION_C
在ExceptionCode中)转换为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(如果我们使用WaitForDebugEventEx
和DBG_PRINTEXCEPTION_WIDE_C
异常 -nDebugStringLength = (WORD)(ExceptionInformation[0] * sizeof(WCHAR))
推荐阅读
- swift - Swift 将 Decodable 结构转换为 Dictionary
- mysql - Django 无法连接到 MySQL 容器?
- vb.net - 使用许多过滤器计算数据表
- python-3.x - 如何像这样用 numpy 重塑数组:
- android - 将 TextView 与另一个多行 TextView 底线对齐
- c# - 在 EF Core 中定义关系
- python - pyomo模型因时间限制停止时保存当前间隙
- batch-file - 如何使用批处理文件删除 2 个特定文件夹中的所有内容?
- mysql - golang/MySQL 上的身份验证不起作用
- javascript - javascript中的鼠标X和鼠标Y