应用程序验证工具 - 停止代码 - 杂项

以下停止代码包含在这组测试中。

对 TerminateThread 的危险调用。

可能的原因

如果线程 ID (参数 1) 使用 TerminateThread 显式终止,则会生成此停止。此函数非常危险,因为它会根据 MSDN) 引入数据损坏和死锁 (。

应用程序验证程序显示的信息
  • 参数 1 - Terminatethread 调用方的线程 ID。
  • 参数 2 - 未使用。
  • 参数 3 - 未使用。
  • 参数 4 - 未使用。

其他信息
  • 测试层: 危险
  • 停止 ID: TERMINATE_THREAD_CALL
  • 停止代码: 100NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

在内存不足的情况下,潜在的堆栈溢出。

可能的原因

如果线程的初始堆栈提交大小使堆栈溢出在内存不足的情况下,如果堆栈无法扩展,则会生成此停止。

应用程序验证程序显示的信息
  • 参数 1 - 未使用。
  • 参数 2 - 未使用。
  • 参数 3 - 未使用。
  • 参数 4 - 未使用。

其他信息
  • 测试层: 危险
  • 停止 ID: STACK_OVERFLOW
  • 停止代码: 100NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

在多个线程仍在运行时调用 ExitProcess。

可能的原因

如果线程在运行多个线程时调用 ExitProcess,则会生成此停止。 在这种情况下,将为每个线程在内部调用 TerminateThread,这可能导致死锁或数据损坏。

应用程序验证程序显示的信息
  • 参数 1 - 正在运行的线程数。
  • 参数 2 - 未使用。
  • 参数 3 - 未使用。
  • 参数 4 - 未使用。

其他信息
  • 测试层: 危险
  • 停止 ID: INVALID_EXIT_PROCESS_CALL
  • 停止代码: 100NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

在 DllMain 期间调用 LoadLibrary。

可能的原因

如果 DllMain 中的代码调用 LoadLibrary 或 FreeLibary,则会生成此停止。 这是 MSDN 禁止的行为。

应用程序验证程序显示的信息
  • 参数 1 - Dll 名称 (使用 du 转储) 。
  • 参数 2 - Dll 基址。
  • 参数 3 - 未使用。
  • 参数 4 - 未使用。

其他信息
  • 测试层: 危险
  • 停止 ID: INVALID_LOAD_LIBRARY_CALL
  • 停止代码: 100NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

在 DllMain 期间调用 FreeLibrary。

可能的原因

如果 DllMain 中的代码调用 LoadLibrary 或 FreeLibary,则会生成此停止。 这是 MSDN 禁止的行为。

应用程序验证程序显示的信息
  • 参数 1 - Dll 名称 (使用 du 转储) 。
  • 参数 2 - Dll 基址。
  • 参数 3 - 未使用。
  • 参数 4 - 未使用。

其他信息
  • 测试层: 危险
  • 停止 ID: INVALID_FREE_LIBRARY_CALL
  • 停止代码: 100NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

使用 MinimumWorkingSetSize = 0xFFFFFFFF调用 SetProcessWorkingSetSize。

可能的原因

请使用 MinimumWorkingSetSize = (SIZE_T) -1。

应用程序验证程序显示的信息
  • 参数 1 - 未使用。
  • 参数 2 - 未使用。
  • 参数 3 - 未使用。
  • 参数 4 - 未使用。

其他信息
  • 测试层: 危险
  • 停止 ID: INVALID_MINIMUM_PROCESS_WORKING_SIZE
  • 停止代码: 100NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

SetProcessWorkingSetSize 是使用 MaximumWorkingSetSize = 0xFFFFFFFF 调用的。

可能的原因

请使用 MaximumWorkingSetSize = (SIZE_T) -1。

应用程序验证程序显示的信息
  • 参数 1 - 未使用。
  • 参数 2 - 未使用。
  • 参数 3 - 未使用。
  • 参数 4 - 未使用。

其他信息
  • 测试层: 危险
  • 停止 ID: INVALID_MAXIMUM_PROCESS_WORKING_SIZE
  • 停止代码: 100NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

使用 MinimumWorkingSetSize = 0xFFFFFFFF 调用 SetProcessWorkingSetSizeEx。

可能的原因

请使用 MinimumWorkingSetSize = (SIZE_T) -1。

应用程序验证程序显示的信息
  • 参数 1 - 未使用。
  • 参数 2 - 未使用。
  • 参数 3 - 未使用。
  • 参数 4 - 未使用。

其他信息
  • 测试层: 危险
  • 停止 ID: INVALID_MINIMUM_PROCESS_WORKING_SIZE_EX
  • 停止代码: 100NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

SetProcessWorkingSetSizeEx 调用时,MaximumWorkingSetSize = 0xFFFFFFFF。

可能的原因

请使用 MaximumWorkingSetSize = (SIZE_T) -1。

应用程序验证程序显示的信息
  • 参数 1 - 未使用。
  • 参数 2 - 未使用。
  • 参数 3 - 未使用。
  • 参数 4 - 未使用。

其他信息
  • 测试层: 危险
  • 停止 ID: INVALID_MAXIMUM_PROCESS_WORKING_SIZE_EX
  • 停止代码: 100NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

线程不能拥有关键节。

可能的原因

如果线程 (线程 ID 为 parameter1,) 终止、挂起或处于 (工作线程完成工作项) 无法包含关键节的状态,则会生成此停止。 当前线程是罪魁祸首。 若要调试此停止,请使用以下调试器命令:$ kb - 获取当前堆栈跟踪。 如果当前线程是关键节的所有者,它可能会调用 ExitThread。 当前线程应在退出之前释放关键部分。 如果当前线程正在调用 TerminateThread 或 SuspendThread,则它不应对包含关键节的线程执行此操作。 $ !cs -s parameter2 - 有关此关键部分的转储信息。 $ ln parameter2 - 显示关键节地址附近的符号。 这应该有助于识别泄漏的关键部分。 $ dps parameter4 - 转储此关键节初始化的堆栈跟踪。

应用程序验证程序显示的信息
  • 参数 1 - 线程 ID。
  • 参数 2 - Critical 节地址。
  • 参数 3 - 关键部分调试信息地址。
  • 参数 4 - 关键部分初始化堆栈跟踪。

其他信息
  • 测试层: 锁
  • 停止 ID: EXIT_THREAD_OWNS_LOCK
  • 停止代码: 200NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

卸载包含活动关键节的 DLL。

可能的原因

如果 DLL 具有包含关键节的全局变量,并且 DLL 已卸载,但尚未删除关键节,则会生成此停止。 若要调试此停止,请使用以下调试器命令:$ du parameter3 - 转储罪魁祸首 DLL 的名称。 $ .reload dllname 或 .reload dllname = parameter4 - 为该 DLL 重新加载符号。 $ !cs -s parameter1 - 有关此关键部分的转储信息。 $ ln parameter1 - 显示关键节地址附近的符号。 这应该有助于识别泄漏的关键部分。 $ dps parameter2 - 转储此关键节初始化的堆栈跟踪。

应用程序验证程序显示的信息
  • 参数 1 - Critical 节地址。
  • 参数 2 - 关键部分初始化堆栈跟踪。
  • 参数 3 - DLL 名称地址。
  • 参数 4 - DLL 基址。

其他信息
  • 测试层: 锁
  • 停止 ID: LOCK_IN_UNLOADED_DLL
  • 停止代码: 200NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

释放包含活动关键部分的堆块。

可能的原因

如果堆分配包含关键节、释放分配且未删除关键节,则会生成此停止。 若要调试此停止,请使用以下调试器命令:$ !cs -s parameter1 - 转储有关此关键部分的信息。 $ ln parameter1 - 显示关键节地址附近的符号。 这应有助于识别泄漏的关键部分。 $ dps parameter2 - 转储此关键节初始化的堆栈跟踪。 $ parameter3 和 parameter4 可能有助于了解此堆块的分配位置, (分配的大小可能) 很大。

应用程序验证程序显示的信息
  • 参数 1 - Critical 节地址。
  • 参数 2 - 关键部分初始化堆栈跟踪。
  • 参数 3 - Heap 块地址。
  • 参数 4 - 堆块大小。

其他信息
  • 测试层: 锁
  • 停止 ID: LOCK_IN_FREED_HEAP
  • 停止代码: 200NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

双重初始化或损坏的关键节。

可能的原因

通常,如果已多次初始化关键节,则会生成此停止。 在这种情况下,parameter3 和 parameter4 是其中两个初始化的堆栈跟踪地址。 在其他一些情况下,如果关键部分或其调试信息结构已损坏,则可能会停止此停止。 在此第二种情况下,parameter3 和 parameter4 可能无效且无用。 若要调试此停止:$ !cs -s -d parameter2 - 有关此关键部分的转储信息。 $ ln parameter1 - 显示关键节地址附近的符号。 如果这是全局变量,则这可能有助于识别关键部分。 $ dps parameter3 和 dps parameter4 - 用于标识初始化此关键节的两个代码路径。

应用程序验证程序显示的信息
  • 参数 1 - Critical 节地址。
  • 参数 2 - 在活动列表中找到的调试信息结构的地址。
  • 参数 3 - 第一个初始化堆栈跟踪。
  • 参数 4 - 第二个初始化堆栈跟踪。

其他信息
  • 测试层: 锁
  • 停止 ID: LOCK_DOUBLE_INITIALIZE
  • 停止代码: 200NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

释放包含活动关键部分的内存。

可能的原因

如果释放了包含关键节的内存,但尚未使用 DeleteCriticalSection 删除关键部分,则会生成此停止。 若要调试此停止,请使用以下调试器命令:$ !cs -s -d parameter2 - 转储有关此关键部分的信息。 $ dps 参数 3 - 用于标识初始化此关键节的代码路径。 在大多数情况下,锁验证程序会立即检测堆分配、DLL 范围、虚拟内存分配或 MapViewOfFile 映射内存范围中包含的关键部分泄漏,并在这些情况下发出不同的停止。 因此,此验证程序停止的案例很少。 锁必须位于由内核模式代码释放的内存范围内,或者由 VirtualFreeEx 等 API 释放的跨进程。 大多数情况下,如果在调试器控制台中按“g”继续LOCK_IN_FREED_HEAP或LOCK_IN_UNLOADED_DLL) (前一个停止,则会遇到此停止。

应用程序验证程序显示的信息
  • 参数 1 - Critical 节地址。
  • 参数 2 - Critical 节调试信息地址。
  • 参数 3 - 关键部分初始化堆栈跟踪。
  • 参数 4 - 未使用。

其他信息
  • 测试层: 锁
  • 停止 ID: LOCK_IN_FREED_MEMORY
  • 停止代码: 200NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

损坏的关键部分。

可能的原因

如果关键部分的 DebugInfo 字段指向释放的内存,则会生成此停止。 通常,在活动关键部分列表中可以找到另一个有效的 DebugInfo 结构。 如果不损坏,两个指针应相同。 若要调试此停止,请使用以下调试器命令:$ !cs -s -d parameter3 - 根据活动列表中发现的调试信息结构的当前内容转储有关此关键部分的信息, (此结构很少损坏,因此通常此信息) 可信。 $ !cs -s parameter1 - 根据关键节结构的当前内容转储有关此关键节的信息, (该结构已损坏,因此有时此信息) 不可信。 $ dps parameter4 - 用于标识初始化此关键节的代码路径。 转储 address parameter1 处的关键部分,并查找损坏模式。 使用 ntdll.dl 的良好符号,可以使用以下命令:$ dt ntdll!_RTL_CRITICAL_SECTION LOCK_ADDRESS $ dt ntdll!_RTL_CRITICAL_SECTION_DEBUG DEBUG_ADDRESS

应用程序验证程序显示的信息
  • 参数 1 - Critical 节地址。
  • 参数 2 - 此关键节的调试信息地址无效。
  • 参数 3 - 在活动列表中找到的调试信息的地址。
  • 参数 4 - 初始化堆栈跟踪。

其他信息
  • 测试层: 锁
  • 停止 ID: LOCK_CORRUPTED
  • 停止代码: 200NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

无效的关键节所有者线程。

可能的原因

如果所有者线程 ID 在当前上下文中无效,则会生成此停止。 若要调试此停止:$ !cs -s parameter1 - 有关此关键部分的转储信息。 $ ln parameter1 - 显示关键节地址附近的符号。 这应该有助于识别关键部分。

应用程序验证程序显示的信息
  • 参数 1 - Critical 节地址。
  • 参数 2 - 拥有线程。
  • 参数 3 - 预期拥有线程。
  • 参数 4 - 关键部分调试信息地址。

其他信息
  • 测试层: 锁
  • 停止 ID: LOCK_INVALID_OWNER
  • 停止代码: 200NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

无效的关键节递归计数。

可能的原因

如果关键节结构的递归计数字段在当前上下文中无效,则会生成此停止。 若要调试此停止:$ !cs -s parameter1 - 有关此关键部分的转储信息。 $ ln parameter1 - 显示关键节地址附近的符号。 这应该有助于识别关键部分。

应用程序验证程序显示的信息
  • 参数 1 - Critical 节地址。
  • 参数 2 - 递归计数。
  • 参数 3 - 预期的递归计数。
  • 参数 4 - 关键部分调试信息地址。

其他信息
  • 测试层: 锁
  • 停止 ID: LOCK_INVALID_RECURSION_COUNT
  • 停止代码: 200NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

删除锁计数无效的关键部分。

可能的原因

如果线程拥有关键节(如果删除该线程)或关键节未初始化,则会生成此停止。 若要调试此停止:$ !cs -s parameter1 - 有关此关键部分的转储信息。 如果拥有线程为 0,则尚未初始化关键部分。 $ ln parameter1 - 显示关键节地址附近的符号。 这应该有助于识别关键部分。

应用程序验证程序显示的信息
  • 参数 1 - Critical 节地址。
  • 参数 2 - Lock count。
  • 参数 3 - 预期锁计数。
  • 参数 4 - 拥有线程。

其他信息
  • 测试层: 锁
  • 停止 ID: LOCK_INVALID_LOCK_COUNT
  • 停止代码: 200NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

关键节过度释放或损坏。

可能的原因

如果释放关键节的次数多于当前线程获取它的时间,则会生成此停止。 若要调试此停止:$ !cs -s parameter1 - 有关此关键部分的转储信息。 $ !cs -s -d parameter4 - 有关此关键部分的转储信息。 $ ln parameter1 - 显示关键节地址附近的符号。 这应该有助于识别关键部分。

应用程序验证程序显示的信息
  • 参数 1 - Critical 节地址。
  • 参数 2 - Lock count。
  • 参数 3 - 预期锁计数。
  • 参数 4 - 关键部分调试信息地址。

其他信息
  • 测试层: 锁
  • 停止 ID: LOCK_OVER_RELEASED
  • 停止代码: 200NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

关键部分未初始化。

可能的原因

如果在未初始化关键节的情况下使用,或者在删除关键节后,将生成此停止。 若要调试此停止:$ ln parameter1 - 显示关键节地址附近的符号。 这应该有助于识别关键部分。

应用程序验证程序显示的信息
  • 参数 1 - Critical 节地址。
  • 参数 2 - 关键部分调试信息地址。
  • 参数 3 - 未使用。
  • 参数 4 - 未使用。

其他信息
  • 测试层: 锁
  • 停止 ID: LOCK_NOT_INITIALIZED
  • 停止代码: 200NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

关键部分已初始化。

可能的原因

如果当前线程重新初始化关键节,则会生成此停止。 若要调试此停止:$ !cs -s parameter1 或 !cs -s -d parameter2 - 转储有关此关键部分的信息。 $ ln parameter1 - 显示关键节地址附近的符号。 如果这是一个全局变量,则这可能有助于识别关键节。 $ dps 参数3 - 用于标识此关键节的第一次初始化的代码路径。 $ kb - 显示当前堆栈跟踪,即重新初始化此关键部分。

应用程序验证程序显示的信息
  • 参数 1 - Critical 节地址。
  • 参数 2 - 关键部分调试信息地址。
  • 参数 3 - 第一个初始化堆栈跟踪。 如果非 NULL,请使用 dps 进行转储
  • 参数 4 - 未使用。

其他信息
  • 测试层: 锁
  • 停止 ID: LOCK_ALREADY_INITIALIZED
  • 停止代码: 200NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

释放包含活动关键部分的虚拟内存。

可能的原因

如果当前线程在包含活动关键节的内存块上调用 VirtualFree,则会生成此停止。 如果释放此内存,则应用程序应在此关键节上调用 DeleteCriticalSection。 $ kb - 显示调用 VirtualFree 的当前堆栈跟踪。 可能的罪魁祸首是调用 VirtualFree 的 DLL。 $ !cs -s parameter1 - 有关此关键部分的转储信息。 $ dps parameter2 - 用于标识此关键节初始化的代码路径。

应用程序验证程序显示的信息
  • 参数 1 - Critical 节地址。
  • 参数 2 - 关键部分初始化堆栈跟踪。
  • 参数 3 - 内存块地址。
  • 参数 4 - 内存块大小。

其他信息
  • 测试层: 锁
  • 停止 ID: LOCK_IN_FREED_VMEM
  • 停止代码: 200NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

取消映射包含活动关键节的内存区域。

可能的原因

如果当前线程在包含活动关键节的内存块上调用 UnmapViewOfFile,则会生成此停止。 如果取消映射此内存,则应用程序应在此关键节上调用 DeleteCriticalSection。 $ kb - 显示调用 UnmapViewOfFile 的当前堆栈跟踪。 可能的罪魁祸首是调用 UnmapViewOfFile 的 DLL。 $ !cs -s parameter1 - 有关此关键部分的转储信息。 $ dps parameter2 - 用于标识此关键节初始化的代码路径。

应用程序验证程序显示的信息
  • 参数 1 - Critical 节地址。
  • 参数 2 - 关键部分初始化堆栈跟踪。
  • 参数 3 - 内存块地址。
  • 参数 4 - 内存块大小。

其他信息
  • 测试层: 锁
  • 停止 ID: LOCK_IN_UNMAPPED_MEM
  • 停止代码: 200NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

当前线程不拥有任何关键部分。

可能的原因

如果当前线程调用 LeaveCriticalSection,则会生成此停止,但根据内部验证程序簿记,它不拥有任何关键部分。 如果 parameter2 为零,则可能是当前线程中的 bug。 它尝试保留未输入的关键节,或者调用 LeaveCriticalSection 的次数可能比调用同一关键节的 EnterCriticalSection 的次数多。 如果 parameter2 不为零 (则它是负整数,) 内部验证程序数据结构可能已损坏。

应用程序验证程序显示的信息
  • 参数 1 - Critical 节地址。
  • 参数 2 - 当前线程拥有的关键节数。
  • 参数 3 - 未使用
  • 参数 4 - 未使用

其他信息
  • 测试层: 锁
  • 停止 ID: THREAD_NOT_LOCK_OWNER
  • 停止代码: 200NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

使用对另一个 DLL 专用的关键节。

可能的原因

如果当前线程尝试使用位于另一个 DLL 中的专用锁,则会生成此停止。 例如,a.dll尝试输入在 ntdll.dll 中定义的关键部分。 不能跨 DLL 使用专用锁。

应用程序验证程序显示的信息
  • 参数 1 - Critical 节地址。
  • 参数 2 - 未使用。
  • 参数 3 - 未使用
  • 参数 4 - 未使用

其他信息
  • 测试层: 锁
  • 停止 ID: LOCK_PRIVATE
  • 停止代码: 200NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

SRW 锁未初始化。

可能的原因

如果线程尝试使用 SRW 锁 (Param1) 未初始化,则会生成此停止。 $ kb - 获取当前堆栈跟踪。 这是使用 SRW 锁的位置。 应先使用 InitializeSRWLock 初始化 SRW 锁,然后才能使用 SRW 锁。

应用程序验证程序显示的信息
  • 参数 1 - SRW Lock
  • 参数 2 - 未使用
  • 参数 3 - 未使用
  • 参数 4 - 未使用

其他信息
  • 测试层: SRWLock
  • 停止 ID: NOT_INITIALIZED
  • 停止代码: 250NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

SRW 锁已初始化。

可能的原因

如果正在重新初始化 param1) (SRW 锁,则会生成此停止。 如果 SRW 锁正被其他线程主动使用,则重新初始化锁将导致应用程序出现不可预知的行为,包括挂起和崩溃。 如果 SRW 锁已静态初始化,则初始化堆栈跟踪可能会显示获取。 $ kb - 获取当前堆栈跟踪。 这是重新初始化 SRW 锁的位置。 $ dps Param3 - 获取 SRW 锁初始化堆栈跟踪。 如果锁定已静态初始化,则此堆栈跟踪可能会显示获取。

应用程序验证程序显示的信息
  • 参数 1 - SRW Lock
  • 参数 2 - 初始化 SRW 锁的线程的 ThreadId。
  • 参数 3 - 初始化堆栈跟踪的地址。 使用 dps <地址> 查看 SRW 锁的初始化位置。
  • 参数 4 - 未使用

其他信息
  • 测试层: SRWLock
  • 停止 ID: ALREADY_INITIALIZED
  • 停止代码: 250NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

SRW 锁上的Acquire-Release不匹配。

可能的原因

如果使用错误的发布 API 释放 param1 (SRW 锁) ,则会生成此停止。 如果 SRW 锁已获取用于共享访问,并且正在使用独占发布 API 释放,或者 SRW 锁已获取用于独占访问,并且正在使用共享发布 API 进行发布。 这可能会导致应用程序出现不可预知的行为,包括挂起和崩溃。 $ kb - 获取当前堆栈跟踪。 这是使用错误 API 释放 SRW 锁的位置。 $ dps Param3 - 获取 SRW 锁获取堆栈跟踪。

应用程序验证程序显示的信息
  • 参数 1 - SRW Lock
  • 参数 2 - 获取 SRW 锁的线程的 ThreadId。
  • 参数 3 - 获取堆栈跟踪的地址。 使用 dps <地址> 查看获取 SRW 锁的位置。
  • 参数 4 - 未使用

其他信息
  • 测试层: SRWLock
  • 停止 ID: MISMATCHED_ACQUIRE_RELEASE
  • 停止代码: 250NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

同一线程以递归方式获取 SRW 锁。

可能的原因

如果同一线程以递归方式获取 Param1 () SRW 锁,则会生成此停止。 这将导致死锁,线程将无限期阻塞。 以递归方式获取独占模式下的 SRW 锁将导致死锁。 当线程等待独占访问时,在共享模式下递归获取 SRW 锁将导致死锁。 请考虑以下示例: - 线程 A 在共享模式下获取 SRW 锁 - 线程 B 尝试在独占模式下获取 SRW 锁并等待 - 线程 A 尝试以递归方式获取共享模式下的 SRW 锁。 只要在本例中 B) 中没有排他服务员 (,此操作就会成功。 由于 SRW 锁没有编写器不足,线程 A 在线程 B 后面等待。现在,线程 B 正在等待线程 A,而线程 A 正在等待线程 B 导致循环等待,从而导致死锁。 $ kb - 获取当前堆栈跟踪。 这是以递归方式获取 SRW 锁的位置。 $ dps Param2 - 获取第一次获取的堆栈跟踪。

应用程序验证程序显示的信息
  • 参数 1 - SRW Lock
  • 参数 2 - 第一个获取堆栈跟踪的地址。 使用 dps <地址> 查看获取 SRW 锁的位置。
  • 参数 3 - 未使用
  • 参数 4 - 未使用

其他信息
  • 测试层: SRWLock
  • 停止 ID: RECURSIVE_ACQUIRE
  • 停止代码: 250NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

正在退出或正在终止的线程拥有 SRW 锁。

可能的原因

如果拥有 SRW 锁的线程 (Param2) (Param1) 退出或终止,则会生成此停止。 这将导致孤立的 SRW 锁,并且尝试获取此锁的线程将无限期阻塞。 $ kb - 获取当前堆栈跟踪。 这是线程退出或正在终止的位置。 $ dps Param3 - 获取 SRW 锁获取堆栈跟踪。

应用程序验证程序显示的信息
  • 参数 1 - SRW Lock
  • 参数 2 - 正在退出或正在终止的线程的 ThreadId。
  • 参数 3 - 获取堆栈跟踪的地址。 使用 dps <地址> 查看获取 SRW 锁的位置。
  • 参数 4 - 未使用

其他信息
  • 测试层: SRWLock
  • 停止 ID: EXIT_THREAD_OWNS_LOCK
  • 停止代码: 250NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

此线程未获取要释放的 SRW 锁。

可能的原因

如果线程 (未获取该锁的 Param2) 释放 srw 锁 (Param1) ,则会生成此停止。 这表示糟糕的编程做法很难得到正确,并可能导致应用程序不可预知的行为。 $ kb - 获取当前堆栈跟踪。 这是线程释放它未获取的 SRW 锁的位置。 $ dps Param4 - 获取 SRW 锁获取堆栈跟踪。

应用程序验证程序显示的信息
  • 参数 1 - SRW Lock
  • 参数 2 - Current ThreadId。
  • 参数 3 - 获取 SRW 锁的线程的 ThreadId。
  • 参数 4 - 获取堆栈跟踪的地址。 使用 dps <地址> 查看获取 SRW 锁的位置。

其他信息
  • 测试层: SRWLock
  • 停止 ID: INVALID_OWNER
  • 停止代码: 250NAN
  • 严重性: 警告
  • 一次性错误: 
  • 错误报告: 没有
  • 记录到文件: 是的
  • 创建回溯: 是的

要释放的内存包含活动的 SRW 锁。

可能的原因

如果释放的 Param1) (内存地址包含仍在使用的活动 SRW 锁,则会生成此停止。 这可能会导致应用程序出现不可预知的行为,包括崩溃和挂起。 $ kb - 获取当前堆栈跟踪。 这是释放包含活动 SRW 锁的内存的位置。 $ dps Param4 - 获取 SRW 锁获取堆栈跟踪。

应用程序验证程序显示的信息
  • 参数 1 - SRW Lock
  • 参数 2 - 要释放的内存的地址。
  • 参数 3 - 获取 SRW 锁的线程的 ThreadId。
  • 参数 4 - 获取堆栈跟踪的地址。 使用 dps <地址> 查看获取 SRW 锁的位置。

其他信息
  • 测试层: SRWLock
  • 停止 ID: IN_FREED_MEMORY
  • 停止代码: 250NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

要卸载的 DLL 包含活动的 SRW 锁。

可能的原因

如果正在卸载的 DLL (Param2) 包含仍在使用的活动 SRW 锁 (Param1) ,则会生成此停止。 这可能会导致应用程序出现不可预知的行为,包括崩溃和挂起。 $ kb - 获取当前堆栈跟踪。 这是要卸载包含活动 SRW 锁的 DLL 的位置。 $ du Param2 - 查找要卸载的 DLL 的名称。 $ dps Param4 - 获取 SRW 锁获取堆栈跟踪。

应用程序验证程序显示的信息
  • 参数 1 - SRW Lock
  • 参数 2 - 要卸载的 DLL 的名称的地址。 使用 du <address> 查看名称。
  • 参数 3 - 获取 SRW 锁的线程的 ThreadId。
  • 参数 4 - 获取堆栈跟踪的地址。 使用 dps <地址> 查看获取 SRW 锁的位置。

其他信息
  • 测试层: SRWLock
  • 停止 ID: IN_UNLOADED_DLL
  • 停止代码: 250NAN
  • 严重性: 警告
  • 一次性错误: 
  • 错误报告: 没有
  • 记录到文件: 是的
  • 创建回溯: 是的

当前堆栈跟踪的句柄异常无效。

可能的原因

如果堆栈顶部的函数将无效句柄传递给系统例程,则会生成此停止。 通常,简单的 kb 命令会显示传递 (句柄的值必须是参数之一 - 通常是) 的第一个参数。 如果值为 null,则这显然是错误的。 如果值看起来正常,则需要使用 !htrace 调试器扩展来获取与此句柄值相关的操作历史记录。 在大多数情况下,必须在关闭后使用句柄值。

应用程序验证程序显示的信息
  • 参数 1 - 异常代码。
  • 参数 2 - 异常记录。 使用 .exr 显示它。
  • 参数 3 - Context record。 使用 .cxr 显示它。
  • 参数 4 - 未使用。

其他信息
  • 测试层: 处理
  • 停止 ID: INVALID_HANDLE
  • 停止代码: 300NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

用于当前堆栈跟踪的 TLS 索引无效。

可能的原因

如果堆栈顶部的函数将无效的 TLS 索引传递给 TLS 系统例程,则会生成此停止。 通常,简单的 kb 命令会显示错误。 此处的典型 bug 是假定 TLS 索引具有特定值,而不是调用 TlsAlloc。 如果认为始终获取值 N,因此无需调用 TlsAlloc,或者更频繁地由于未初始化的变量,可能会发生这种情况。

应用程序验证程序显示的信息
  • 参数 1 - 无效的 TLS 索引。
  • 参数 2 - 索引的预期下半部分。
  • 参数 3 - 未使用。
  • 参数 4 - 未使用。

其他信息
  • 测试层: 处理
  • 停止 ID: INVALID_TLS_VALUE
  • 停止代码: 300NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

WaitForMultipleObjects 调用的参数无效。

可能的原因

如果堆栈顶部的名为 WaitForMultipleObjects 的函数以 NULL 作为要等待的句柄数组的地址,或者将零作为句柄数,则会生成此停止。 简单的 kb 命令会错误地显示调用此 API 的函数。

应用程序验证程序显示的信息
  • 参数 1 - 对象的地址处理向量。
  • 参数 2 - 句柄数。
  • 参数 3 - 未使用。
  • 参数 4 - 未使用。

其他信息
  • 测试层: 处理
  • 停止 ID: INCORRECT_WAIT_CALL
  • 停止代码: 300NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

作为参数传递的 NULL 句柄。 必须使用有效的句柄。

可能的原因

如果堆栈顶部的函数将 NULL 句柄传递给系统例程,则会生成此停止。

应用程序验证程序显示的信息
  • 参数 1 - 未使用。
  • 参数 2 - 未使用。
  • 参数 3 - 未使用。
  • 参数 4 - 未使用。

其他信息
  • 测试层: 处理
  • 停止 ID: NULL_HANDLE
  • 停止代码: 300NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

在 DllMain 中等待线程句柄。

可能的原因

如果当前线程当前在当前进程中加载的 DLL 之一的 DllMain 函数内运行代码,并且调用 WaitForSingleObject 或 WaitForMultipleObjects 来等待同一进程中的线程句柄,则会生成此停止。 这很可能导致死锁,因为除非第二个线程退出,否则线程句柄不会收到信号。 当第二个线程调用 ExitThread 时,它将尝试获取 DLL 加载程序锁,然后为当前进程中的所有 DLL 调用 DllMain (DLL_THREAD_DETACH) 。 但加载程序锁由第一个线程拥有, (正在等待线程句柄) 的线程,因此两个线程将死锁。

应用程序验证程序显示的信息
  • 参数 1 - 线程句柄。
  • 参数 2 - 未使用。
  • 参数 3 - 未使用。
  • 参数 4 - 未使用。

其他信息
  • 测试层: 处理
  • 停止 ID: WAIT_IN_DLLMAIN
  • 停止代码: 300NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

句柄的对象类型不正确。

可能的原因

如果当前线程调用的 API 的句柄指向对象类型不正确的对象,则会生成此停止。 例如,使用信号灯句柄作为参数调用 SetEvent 将生成此停止。 若要调试此停止,请: $ kb - 以显示当前堆栈跟踪。 罪魁祸首可能是调用verifier.dll的 DLL;$ du parameter2 - 显示句柄的实际类型。 句柄值为 parameter1。 在上面的示例中,将显示:信号灯。 $ du parameter3 - 显示 API 所需的对象类型。 在上面的示例中,此名称将为:Event。 $ !htrace parameter1 可能很有用,因为它将显示此句柄上最近打开/关闭操作的堆栈跟踪。

应用程序验证程序显示的信息
  • 参数 1 - 句柄值。
  • 参数 2 - 对象类型名称。 使用 du 显示它
  • 参数 3 - 预期的对象类型名称。 使用 du 显示它
  • 参数 4 - 未使用。

其他信息
  • 测试层: 处理
  • 停止 ID: INCORRECT_OBJECT_TYPE
  • 停止代码: 300NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

卸载分配了未释放的 TLS 索引的 DLL。

可能的原因

如果在释放 TLS 索引之前卸载分配 TLS 索引的 DLL,则会生成此停止。 若要调试此停止:$ du parameter3 - 显示罪魁祸首 DLL 的名称;$ .reload xxx.dll=parameter4 - 如果需要,请重新加载罪魁祸首 DLL (的符号) 。 xxx.dll是上述步骤中显示的 DLL 的名称;$ u parameter2 - 反汇编分配 TLS 的代码。 这应指向分配了 TLS 但忘记在 DLL 卸载之前释放 TLS 的函数。

应用程序验证程序显示的信息
  • 参数 1 - TLS 索引
  • 参数 2 - 分配此 TLS 索引的代码的地址。
  • 参数 3 - DLL 名称地址。 使用 du 将其转储。
  • 参数 4 - DLL 基址。

其他信息
  • 测试层: Tls
  • 停止 ID: TLS_LEAK
  • 停止代码: 350NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

验证程序 TLS 结构损坏。

可能的原因

如果用于存储线程 TLS 槽状态的内部验证程序结构已损坏,则会生成此停止。 很可能是由于过程中存在一些随机损坏。

应用程序验证程序显示的信息
  • 参数 1 - TEB 地址。
  • 参数 2 - 预期的 TEB 地址。
  • 参数 3 - 线程 ID。
  • 参数 4 - 预期的线程 ID。

其他信息
  • 测试层: Tls
  • 停止 ID: CORRUPTED_TLS
  • 停止代码: 350NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

使用无效的 TLS 索引。

可能的原因

如果使用无效的 TLS 索引,则会生成此停止。 在大多数情况下,这是因为调用 TlsFree 时代码仍在使用此索引。 下面是线程池线程的示例。 T1:Dll 加载和 TlsAlloc T1:队列回调 T1:跳过等待/取消回调 T1:TlsFree T2:回调运行并调用 TlsSetValue T1:Dll 卸载

应用程序验证程序显示的信息
  • 参数 1 - TLS 索引
  • 参数 2 - 未使用。
  • 参数 3 - 未使用。
  • 参数 4 - 未使用。

其他信息
  • 测试层: Tls
  • 停止 ID: INVALID_TLS_INDEX
  • 停止代码: 350NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

释放大小或起始地址无效的虚拟内存块。

可能的原因

如果应用验证程序检测到 VirtualFree 或 DLL 卸载的起始地址或内存分配大小无效,则会生成此停止。 在 DLL 卸载的情况下,这可能意味着加载的 DLL 列表中内存损坏。 若要调试此停止,请查看当前堆栈跟踪以及即将释放的内存地址和大小,并尝试确定它们无效的原因。

应用程序验证程序显示的信息
  • 参数 1 - 分配基址。
  • 参数 2 - 内存区域大小。
  • 参数 3 - 未使用。
  • 参数 4 - 未使用。

其他信息
  • 测试层: 记忆
  • 停止 ID: INVALID_FREEMEM
  • 停止代码: 600NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

虚拟分配调用不正确。

可能的原因

如果应用验证程序检测到具有无效的开始地址或内存分配大小的 VirtualAlloc 调用,则会生成此停止。 若要调试此停止,请查看当前堆栈跟踪 (kb) 以及即将分配的内存地址和大小,并尝试确定它们无效的原因。

应用程序验证程序显示的信息
  • 参数 1 - 指向分配基址的指针。
  • 参数 2 - 指向内存区域大小的指针。
  • 参数 3 - 未使用
  • 参数 4 - 未使用

其他信息
  • 测试层: 记忆
  • 停止 ID: INVALID_ALLOCMEM
  • 停止代码: 600NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

映射视图调用不正确。

可能的原因

如果应用验证程序检测到映射基址或大小无效的 MapViewOfFile 调用,则会生成此停止。 若要调试此停止,请查看当前堆栈跟踪 (kb) 以及即将映射的内存地址和大小,并尝试确定它们无效的原因。

应用程序验证程序显示的信息
  • 参数 1 - 指向映射基址的指针。
  • 参数 2 - 指向视图大小的指针。
  • 参数 3 - 未使用。
  • 参数 4 - 未使用。

其他信息
  • 测试层: 记忆
  • 停止 ID: INVALID_MAPVIEW
  • 停止代码: 600NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

探测无效地址。

可能的原因

如果应用验证程序检测到 IsBadXXXPtr 调用的地址 (无效,例如内核模式地址,而不是用于探测内存缓冲区的普通用户模式地址) ,则会生成此停止。 若要调试此停止,请查看当前堆栈跟踪 (kb) ,并尝试确定 IsBadXXXPtr 函数的调用方最终使用无效地址的原因。 很多时候,该地址是纯虚假的,例如未初始化的指针。 MSDN 库列出了应用程序不应使用 IsBadXXXPtr API 的几个原因:在抢占式多任务环境中,其他线程可能会更改进程对所测试内存的访问。 取消引用可能无效的指针可能会禁用其他线程中的堆栈扩展。 当禁用堆栈扩展时,线程耗尽其堆栈会导致父进程立即终止,没有弹出窗口错误窗口或诊断信息。 进程中的线程应以这样一种方式协同工作,这样一个进程就不会释放另一个线程所需的内存。 使用此函数不会否定执行此操作的需要。 如果不这样做,应用程序可能会以不可预知的方式失败。 由于所有这些原因,我们建议永远不要使用这些 API。

应用程序验证程序显示的信息
  • 参数 1 - 起始地址。
  • 参数 2 - 内存块大小。
  • 参数 3 - 地址无效。
  • 参数 4 - 未使用。

其他信息
  • 测试层: 记忆
  • 停止 ID: PROBE_INVALID_ADDRESS
  • 停止代码: 600NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

探测可用内存。

可能的原因

如果应用验证程序检测到对可用内存分配的 IsBadXXXPtr 调用,则会生成此停止。 这是非常糟糕的,因为在某些其他情况下,可能已将此内存重新用于其他分配。 由于当前代码路径 (kb) 不拥有该内存,因此它最终可能会损坏其他人的内存,并产生灾难性的影响。 若要调试此停止,请查看当前堆栈跟踪 (kb) ,并尝试确定 IsBadXXXPtr 函数的调用方最终探测可用内存的原因。 地址可能是纯虚假 (例如未初始化的指针) ,也可能是已释放的内存。 如果内存已由 VirtualFree 或 UnmapViewOfFile API 之一释放,则“!avrf -vs -a parameter3”将搜索分配/释放该地址的代码路径的堆栈跟踪日志,并显示这些堆栈跟踪(如果可用)。 这可能显示释放了此内存的堆栈跟踪。 更多情况下,内存是已释放的堆分配。 为了检查这种可能性,“!avrf -hp -a parameter3”将搜索从/向堆分配/释放该地址的代码路径的堆栈跟踪日志,并显示这些堆栈跟踪(如果可用)。 MSDN 库列出了应用程序不应使用 IsBadXXXPtr API 的几个原因:在抢占式多任务环境中,其他线程可能会更改进程对所测试内存的访问。 取消引用可能无效的指针可能会禁用其他线程中的堆栈扩展。 当禁用堆栈扩展时,线程耗尽其堆栈会导致父进程立即终止,没有弹出窗口错误窗口或诊断信息。 进程中的线程应以这样一种方式协同工作,这样一个进程就不会释放另一个线程所需的内存。 使用此函数不会否定执行此操作的需要。 如果不这样做,应用程序可能会以不可预知的方式失败。 由于所有这些原因,我们建议永远不要使用这些 API。

应用程序验证程序显示的信息
  • 参数 1 - 起始地址。
  • 参数 2 - 内存块大小。
  • 参数 3 - 可用内存页的地址。
  • 参数 4 - 未使用。

其他信息
  • 测试层: 记忆
  • 停止 ID: PROBE_FREE_MEM
  • 停止代码: 600NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

探测保护页。

可能的原因

如果应用验证程序检测到至少包含一个GUARD_PAGE的内存分配的 IsBadXXXPtr 调用,则会生成此停止。 这是非常糟糕的,因为此GUARD_PAGE很有可能是线程当前堆栈的末尾。 如 MSDN 库中所述:取消引用可能无效的指针可能会禁用其他线程中的堆栈扩展。 如果禁用堆栈扩展,线程耗尽其堆栈,将导致父进程立即终止,并且没有弹出窗口错误窗口或诊断信息。 若要调试此停止,请查看当前堆栈跟踪 (kb) ,并尝试确定 IsBadXXXPtr 函数的调用方最终探测GUARD_PAGE的原因。 MSDN 库列出了应用程序不应使用 IsBadXXXPtr API 的几个原因:在抢占式多任务环境中,其他线程可能会更改进程对所测试内存的访问。 取消引用可能无效的指针可能会禁用其他线程中的堆栈扩展。 如果禁用堆栈扩展,线程耗尽其堆栈,将导致父进程立即终止,并且没有弹出窗口错误窗口或诊断信息。 进程中的线程应以一种不会释放另一个线程所需的内存的方式进行协作。 使用此函数并不能抵消执行此操作的需要。 如果未执行此操作,应用程序可能会以不可预知的方式失败。 由于所有这些原因,建议永远不要使用这些 API。

应用程序验证程序显示的信息
  • 参数 1 - 开始地址。
  • 参数 2 - 内存块大小。
  • 参数 3 - guard 页的地址。
  • 参数 4 - 未使用。

其他信息
  • 测试层: 记忆
  • 停止 ID: PROBE_GUARD_PAGE
  • 停止代码: 600NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

探测 NULL 地址。

可能的原因

如果应用验证程序检测到具有 NULL 地址的 IsBadXXXPtr 调用,则会生成此停止。 若要调试此停止,请查看当前堆栈跟踪 (kb) ,并尝试确定 IsBadXXXPtr 函数的调用方最终使用 NULL 地址的原因。 这通常是某人未检查某个内存分配函数的返回值的迹象。 例如,以下代码不正确:int main (void) { PVOID p; p = malloc (1024) ;使用 (p) ;返回 0;} void 使用 (PVOID p) { if (IsBadReadPtr (p) ) { return; } // // p 可以安全地在此处使用。 } 此代码应重新编写为:int main (void) { PVOID p; p = malloc (1024) ;如果 (NULL == p) ) { return -1; }使用 (p) ;返回 0;} void 使用 (PVOID p) { // // p 可以安全地在此处使用。 } MSDN 库列出了应用程序不应使用 IsBadXXXPtr API 的几个原因:在抢占式多任务环境中,其他线程可能会更改进程对所测试内存的访问。 取消引用可能无效的指针可能会禁用其他线程中的堆栈扩展。 如果禁用堆栈扩展,线程耗尽其堆栈,将导致父进程立即终止,并且没有弹出窗口错误窗口或诊断信息。 进程中的线程应以一种不会释放另一个线程所需的内存的方式进行协作。 使用此函数并不能抵消执行此操作的需要。 如果未执行此操作,应用程序可能会以不可预知的方式失败。 由于所有这些原因,建议永远不要使用这些 API。

应用程序验证程序显示的信息
  • 参数 1 - 未使用。
  • 参数 2 - 未使用。
  • 参数 3 - 未使用。
  • 参数 4 - 未使用。

其他信息
  • 测试层: 记忆
  • 停止 ID: PROBE_NULL
  • 停止代码: 600NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

探测具有无效起始地址或大小的内存块。

可能的原因

如果应用验证程序检测到 IsBadXXXPtr 调用的起始地址 (无效,例如内核模式地址,而不是正常的用户模式地址) 或要探测的内存缓冲区大小无效,则会生成此停止。 若要调试此停止,请查看当前堆栈跟踪 (kb) ,并尝试确定 IsBadXXXPtr 函数的调用方最终导致地址或大小无效的原因。 很多时候,地址或大小都是纯虚假的,例如未初始化的变量。 MSDN 库列出了应用程序不应使用 IsBadXXXPtr API 的几个原因:在抢占式多任务环境中,其他线程可能会更改进程对所测试内存的访问。 取消引用可能无效的指针可能会禁用其他线程中的堆栈扩展。 如果禁用堆栈扩展,线程耗尽其堆栈,将导致父进程立即终止,并且没有弹出窗口错误窗口或诊断信息。 进程中的线程应以一种不会释放另一个线程所需的内存的方式进行协作。 使用此函数并不能抵消执行此操作的需要。 如果未执行此操作,应用程序可能会以不可预知的方式失败。 由于所有这些原因,建议永远不要使用这些 API。

应用程序验证程序显示的信息
  • 参数 1 - 开始地址。
  • 参数 2 - 内存块大小。
  • 参数 3 - 未使用。
  • 参数 4 - 未使用。

其他信息
  • 测试层: 记忆
  • 停止 ID: PROBE_INVALID_START_OR_SIZE
  • 停止代码: 600NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

卸载大小或起始地址无效的 DLL。

可能的原因

如果应用验证程序检测到 DLL 卸载的起始地址或 DLL 内存范围的大小无效,则会生成此停止。 这可能意味着内部ntdll.dll加载的 DLL 列表中内存损坏。

应用程序验证程序显示的信息
  • 参数 1 - DLL 内存基址。
  • 参数 2 - DLL 内存范围大小。
  • 参数 3 - DLL 名称地址。 使用 du 将其转储。
  • 参数 4 - 未使用。

其他信息
  • 测试层: 记忆
  • 停止 ID: INVALID_DLL_RANGE
  • 停止代码: 600NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

释放当前线程的堆栈地址范围内的内存块。

可能的原因

如果应用验证程序检测到 VirtualFree 内存块实际上是当前线程堆栈的一部分 (!) ,则会生成此停止。 若要调试此停止,请查看当前堆栈跟踪 (kb) ,并尝试了解为什么调用 VirtualFree 的函数认为内存块是动态分配或映射的,但实际上是从堆栈分配的内存。

应用程序验证程序显示的信息
  • 参数 1 - 分配基址。
  • 参数 2 - 内存区域大小。
  • 参数 3 - 堆栈低限制地址。
  • 参数 4 - 堆栈高限制地址。

其他信息
  • 测试层: 记忆
  • 停止 ID: FREE_THREAD_STACK_MEMORY
  • 停止代码: 600NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

VirtualFree 操作的 FreeType 参数不正确。

可能的原因

如果应用验证程序检测到 FreeType 参数的值不正确,则会生成此停止。 此参数仅有两个可接受的值是MEM_DECOMMIT和MEM_RELEASE。 如果使用除这两个值以外的任何其他值调用 VirtualFree,则 VirtualFree 将无法释放内存。 若要调试此停止,请查看当前堆栈跟踪 (kb) :VirtualFree 的调用方可能是罪魁祸首。

应用程序验证程序显示的信息
  • 参数 1 - 应用程序使用的值不正确。
  • 参数 2 - 应为正确的值 1。
  • 参数 3 - 应为正确的值 2。
  • 参数 4 - 未使用。

其他信息
  • 测试层: 记忆
  • 停止 ID: INVALID_FREE_TYPE
  • 停止代码: 600NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

尝试释放已可用的虚拟内存块。

可能的原因

如果应用验证程序检测到已可用的地址有 VirtualFree,则会生成此停止。 若要调试此内存,请停止查看当前堆栈跟踪 (kb) ,并尝试确定为什么内存已可用,但应用程序正在尝试再次释放内存。 “!avrf -vs -a parameter1”将搜索分配/释放该地址的代码路径的堆栈跟踪日志,并显示这些堆栈跟踪(如果可用)。 这可能显示释放了此内存的堆栈跟踪。

应用程序验证程序显示的信息
  • 参数 1 - 内存块地址。
  • 参数 2 - 未使用。
  • 参数 3 - 未使用。
  • 参数 4 - 未使用。

其他信息
  • 测试层: 记忆
  • 停止 ID: MEM_ALREADY_FREE
  • 停止代码: 600NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

VirtualFree (MEM_RELEASE) 操作的 Size 参数不正确。

可能的原因

如果应用验证程序检测到 dwSize 参数具有非零值的 VirtualFree (MEM_RELEASE) ,则会生成此停止。 使用 MEM_RELEASE 时,此参数的唯一可接受的值为 0。 如果使用除 0 之外的任何其他值调用 VirtualFree,则 VirtualFree 将无法释放内存。 若要调试此停止,请查看当前堆栈跟踪 (kb) :VirtualFree 的调用方可能是罪魁祸首。

应用程序验证程序显示的信息
  • 参数 1 - 应用程序使用的大小不正确。
  • 参数 2 - 预期大小正确 (0) 。
  • 参数 3 - 未使用。
  • 参数 4 - 未使用。

其他信息
  • 测试层: 记忆
  • 停止 ID: INVALID_FREE_SIZE
  • 停止代码: 600NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

DLL 入口点例程中引发意外异常。

可能的原因

如果 DLL 的入口点 (DllMain) 函数引发异常,则会生成此停止。 错误的示例之一是:如果 DllMain (DLL_PROCESS_ATTACH) 引发异常,Windows DLL 加载程序将: - 捕获并隐藏异常;- 卸载 DLL 而不调用 DLLMain (DLL_PROCESS_DETACH) 。 因此,在许多情况下,DLL 已经分配了一些资源,然后会引发异常,并且它将无法在 DllMain (DLL_PROCESS_DETACH) 上释放这些资源。 若要调试此停止:$ du parameter1 - 显示 DLL 名称;$ .exr parameter2 - 显示异常信息;$ .cxr 参数3,后跟 kb - 显示异常上下文信息和引发异常时的堆栈跟踪;$ parameter4 是内部验证程序结构的地址,对大多数验证程序用户没有任何意义。

应用程序验证程序显示的信息
  • 参数 1 - DLL 名称 (使用 du 将其转储) 。
  • 参数 2 - 异常记录。 使用 .exr 显示它。
  • 参数 3 - Context record。 使用 .cxr 显示它。
  • 参数 4 - Verifier dll 描述符

其他信息
  • 测试层: 记忆
  • 停止 ID: DLL_UNEXPECTED_EXCEPTION
  • 停止代码: 600NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

线程函数中引发意外异常。

可能的原因

如果线程函数引发异常,则会生成此停止。 这很糟糕,因为整个过程将被终止。 若要调试此停止:$ parameter1 对于异常类型而言可能很重要。 例如,异常代码 C0000005 表示访问冲突;$ .exr parameter2 - 显示异常信息;$ .cxr 参数 3,后跟 kb - 以显示异常上下文信息;

应用程序验证程序显示的信息
  • 参数 1 - 异常代码。
  • 参数 2 - 异常记录。 使用 .exr 显示它。
  • 参数 3 - Context record。 使用 .cxr 显示它。
  • 参数 4 - 未使用。

其他信息
  • 测试层: 记忆
  • 停止 ID: THREAD_UNEXPECTED_EXCEPTION
  • 停止代码: 600NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

探测内存时引发意外异常。

可能的原因

如果在 IsBadXXXPtr 调用期间收到异常,则会生成此停止。 这意味着,我们正在探测的内存缓冲区实际上没有调用方假定的保护,或者内存已释放,等等。请参阅上面关于其他停止代码 (PROBE_INVALID_ADDRESS、PROBE_FREE_MEM、PROBE_GUARD_PAGE、PROBE_NULL PROBE_INVALID_START_OR_SIZE) 的讨论,了解有关为何不建议使用 IsBadXXXPtr API 的更多示例。 若要调试此停止:$ parameter1 通常为 C0000005,这意味着访问冲突;$ .exr parameter2 - 显示异常信息;$ .cxr 参数3,后跟 kb - 在引发异常时显示异常上下文信息和堆栈跟踪;

应用程序验证程序显示的信息
  • 参数 1 - 异常代码。
  • 参数 2 - 异常记录。 使用 .exr 显示它。
  • 参数 3 - Context record。 使用 .cxr 显示它。
  • 参数 4 - 未使用

其他信息
  • 测试层: 记忆
  • 停止 ID: PROBE_UNEXPECTED_EXCEPTION
  • 停止代码: 600NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

尝试重置 NULL 地址。

可能的原因

如果应用验证程序检测到 VirtualFree (MEM_RESET) 调用具有 NULL 第一个参数,则会生成此停止。 MEM_RESET应仅用于已分配的内存,因此在本例中 NULL 不是有效的第一个参数。

应用程序验证程序显示的信息
  • 参数 1 - 未使用。
  • 参数 2 - 未使用。
  • 参数 3 - 未使用。
  • 参数 4 - 未使用。

其他信息
  • 测试层: 记忆
  • 停止 ID: INVALID_MEM_RESET
  • 停止代码: 600NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

释放当前线程的堆栈地址范围内的堆内存块。

可能的原因

如果应用验证程序针对实际属于当前线程堆栈的内存块检测到 HeapFree,则生成此停止 (!) 。 若要调试此停止,请查看当前堆栈跟踪 (kb) ,并尝试了解为什么名为 HeapFree 的函数认为内存块是动态分配或映射的,但实际上是从堆栈分配的内存。

应用程序验证程序显示的信息
  • 参数 1 - 分配基址。
  • 参数 2 - 内存区域大小。
  • 参数 3 - Stack 低限制地址。
  • 参数 4 - Stack 高限制地址。

其他信息
  • 测试层: 记忆
  • 停止 ID: FREE_THREAD_STACK_MEMORY_AS_HEAP
  • 停止代码: 600NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

取消映射当前线程的堆栈地址范围内的内存区域。

可能的原因

如果应用验证程序检测到实际属于当前线程堆栈的内存块的 UnmapViewOfFile (!) ,则会生成此停止。 若要调试此停止,请查看当前堆栈跟踪 (kb) ,并尝试了解为什么调用 UnmapViewOfFile 的函数认为内存块是动态分配或映射的,但实际上是从堆栈分配的内存。

应用程序验证程序显示的信息
  • 参数 1 - 分配基址。
  • 参数 2 - 内存区域大小。
  • 参数 3 - Stack 低限制地址。
  • 参数 4 - Stack 高限制地址。

其他信息
  • 测试层: 记忆
  • 停止 ID: FREE_THREAD_STACK_MEMORY_AS_MAP
  • 停止代码: 600NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

RTL_RESOURCE地址不正确。

可能的原因

如果应用程序尝试使用 NULL 或其他一些不正确的地址 (例如内核模式地址) 作为有效对象的地址,则会生成此停止。 RtlInitializeResource (NULL) 是不正确的 API 调用,将触发此类验证程序停止。 param1 使用的地址不正确,罪魁祸首位于堆栈跟踪上, (用 kb) 显示它。

应用程序验证程序显示的信息
  • 参数 1 - Address。
  • 参数 2 - 未使用。
  • 参数 3 - 未使用。
  • 参数 4 - 未使用。

其他信息
  • 测试层: 记忆
  • 停止 ID: INVALID_RESOURCE_ADDRESS
  • 停止代码: 600NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

关键节地址无效。

可能的原因

如果应用程序尝试使用 NULL 或其他一些不正确的地址 (例如内核模式地址) 作为有效对象的地址,则会生成此停止。 EnterCriticalSection (NULL) 是不正确的 API 调用,将触发此类验证程序停止。 param1 使用的地址不正确,罪魁祸首位于堆栈跟踪上, (用 kb) 显示它。

应用程序验证程序显示的信息
  • 参数 1 - Address。
  • 参数 2 - 未使用。
  • 参数 3 - 未使用。
  • 参数 4 - 未使用。

其他信息
  • 测试层: 记忆
  • 停止 ID: INVALID_CRITSECT_ADDRESS
  • 停止代码: 600NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

尝试在非可执行内存中执行代码。

可能的原因

如果应用程序尝试从不可执行或免费地址运行代码,则会生成此停止。 若要调试此停止:$ u parameter2 - 取消组合罪魁祸首代码 $ .exr parameter3 - 以显示异常信息;$ .cxr 参数 4 后跟 kb - 显示异常上下文信息和引发异常时的堆栈跟踪。

应用程序验证程序显示的信息
  • 参数 1 - 正在访问的地址。
  • 参数 2 - 执行无效访问的代码。
  • 参数 3 - 异常记录。 使用 .exr 显示它。
  • 参数 4 - Context record。 使用 .cxr 显示它。

其他信息
  • 测试层: 记忆
  • 停止 ID: THREAD_UNEXPECTED_EXCEPTION_CODE
  • 停止代码: 600NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

初始化输出缓冲区时引发意外异常。

可能的原因

如果在初始化指定为 Win32 或 CRT API 的输出参数的缓冲区时遇到异常,则会生成此停止。 这通常意味着指定的输出缓冲区大小不正确。 若要调试此停止:$ .exr parameter3 - 显示异常信息;$ .cxr 参数 4 后跟 kb - 在引发异常时显示异常上下文信息和堆栈跟踪。

应用程序验证程序显示的信息
  • 参数 1 - Buffer 起始地址。
  • 参数 2 - 缓冲区大小。
  • 参数 3 - 异常记录。 使用 .exr 显示它。
  • 参数 4 - Context record。 使用 .cxr 显示它。

其他信息
  • 测试层: 记忆
  • 停止 ID: OUTBUFF_UNEXPECTED_EXCEPTION
  • 停止代码: 600NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

尝试查找堆块大小时出现意外异常。

可能的原因

如果我们在为正在释放的堆块调用 HeapSize 时遇到异常,则会生成此停止。 这通常意味着指定的堆块地址不正确或堆已损坏。 若要调试此停止:$ .exr parameter3 - 显示异常记录;$ .cxr 参数 4 后跟 kb - 在引发异常时显示异常上下文信息和堆栈跟踪。

应用程序验证程序显示的信息
  • 参数 1 - 要释放的堆块的地址。
  • 参数 2 - 堆句柄。
  • 参数 3 - 异常记录。 使用 .exr 显示它。
  • 参数 4 - Context record。 使用 .cxr 显示它。

其他信息
  • 测试层: 记忆
  • 停止 ID: SIZE_HEAP_UNEXPECTED_EXCEPTION
  • 停止代码: 600NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

释放具有无效起始地址的内存块。

可能的原因

如果程序使用 lpAddress 参数调用 VirtualFree (MEM_RELEASE) ,该参数不是保留页面区域时 VirtualAlloc 或 VirtualAllocEx 函数返回的基址,则会生成此停止:若要调试此停止:$ kb - 显示调用 VirtualFree 的当前堆栈跟踪。 可能的罪魁祸首是调用 VirtualFree 的 DLL。

应用程序验证程序显示的信息
  • 参数 1 - 正在释放的内存块的地址。
  • 参数 2 - 预期正确的内存块地址。
  • 参数 3 - 未使用。
  • 参数 4 - 未使用。

其他信息
  • 测试层: 记忆
  • 停止 ID: INVALID_FREEMEM_START_ADDRESS
  • 停止代码: 600NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

取消映射具有无效起始地址的内存块。

可能的原因

如果程序使用 lpBaseAddress 参数调用 UnmapViewOfFile,该参数与以前调用 MapViewOfFile 或 MapViewOfFileEx 函数返回的值不同,则会生成此停止。 若要调试此停止:$ kb - 显示调用 UnmapViewOfFile 的当前堆栈跟踪。 可能罪魁祸首是调用 UnmapViewOfFile 的 DLL。

应用程序验证程序显示的信息
  • 参数 1 - 正在取消映射的内存块的地址。
  • 参数 2 - 预期正确的内存块地址。
  • 参数 3 - 未使用。
  • 参数 4 - 未使用。

其他信息
  • 测试层: 记忆
  • 停止 ID: INVALID_UNMAPVIEW_START_ADDRESS
  • 停止代码: 600NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

线程池回调函数中引发意外异常。

可能的原因

如果线程池线程中的回调函数引发异常,则会生成此停止。 若要调试此停止:$ parameter1 对于异常类型可能很重要。 例如,异常代码 C0000005 表示访问冲突。 $ .exr parameter2 - 显示异常信息。 $ .cxr 参数 3,后跟 kb - 用于显示异常上下文信息。

应用程序验证程序显示的信息
  • 参数 1 - 异常代码
  • 参数 2 - 异常记录。 使用 .exr 显示它
  • 参数 3 - Context record。 使用 .cxr 显示它
  • 参数 4 - 未使用

其他信息
  • 测试层: 记忆
  • 停止 ID: THREADPOOL_UNEXPECTED_EXCEPTION
  • 停止代码: 600NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

非可执行内存中的代码

可能的原因

如果应用程序尝试从不可执行或空闲的地址运行代码,则会生成此停止。 若要调试此停止:$ u parameter2 - 取消组合罪魁祸首代码 $ .exr parameter3 - 显示异常信息 $ .cxr parameter4 后跟 kb - 以显示异常上下文信息和引发异常的时间堆栈跟踪。

应用程序验证程序显示的信息
  • 参数 1 - 正在访问的地址
  • 参数 2 - 执行无效访问的代码
  • 参数 3 - 异常记录。 使用 .exr 显示它。
  • 参数 4 - Context record。 使用 .cxr 显示它。

其他信息
  • 测试层: 记忆
  • 停止 ID: THREADPOOL_UNEXPECTED_EXCEPTION_CODE
  • 停止代码: 600NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

创建可执行堆。

可能的原因

如果应用程序正在创建可执行堆,则会生成此停止。 这可能是一个安全风险。

应用程序验证程序显示的信息
  • 参数 1 - 未使用。
  • 参数 2 - 未使用。
  • 参数 3 - 未使用。
  • 参数 4 - 未使用。

其他信息
  • 测试层: 记忆
  • 停止 ID: EXECUTABLE_HEAP
  • 停止代码: 600NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

分配可执行内存。

可能的原因

如果应用程序正在分配可执行内存,则会生成此停止。 这可能是一个安全风险。

应用程序验证程序显示的信息
  • 参数 1 - 由调用方指定的页面保护。
  • 参数 2 - 未使用。
  • 参数 3 - 未使用。
  • 参数 4 - 未使用。

其他信息
  • 测试层: 记忆
  • 停止 ID: EXECUTABLE_MEMORY
  • 停止代码: 600NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

尝试在非可执行内存中执行代码 (第一次机会) 。

可能的原因

如果应用程序尝试从不可执行或免费地址运行代码,则会生成此停止。 若要调试此停止:$ u parameter2 - 取消组合罪魁祸首代码 $ .exr parameter3 - 以显示异常信息;$ .cxr 参数 4 后跟 kb - 显示异常上下文信息和引发异常时的堆栈跟踪。

应用程序验证程序显示的信息
  • 参数 1 - 正在访问的地址。
  • 参数 2 - 执行无效访问的代码。
  • 参数 3 - 异常记录。 使用 .exr 显示它。
  • 参数 4 - Context record。 使用 .cxr 显示它。

其他信息
  • 测试层: 异常
  • 停止 ID: FIRST_CHANCE_ACCESS_VIOLATION_CODE
  • 停止代码: 650NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

此线程池线程的优先级已更改。

可能的原因

如果线程优先级在返回到线程池时发生更改,则会生成此停止。

应用程序验证程序显示的信息
  • 格式: -  线程池线程 (%x) 已执行回调 (%p) 的线程优先级已更改 (%i -> %i)
  • 参数 1 - Callback 函数。
  • 参数 2 - Context。
  • 参数 3 - Threadpool 对象分配堆栈跟踪,使用 dps 将其转储。
  • 参数 4 - 当前优先级。

其他信息
  • 测试层: Threadpool
  • 停止 ID: INCONSISTENT_PRIORITY
  • 停止代码: 700NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

此线程池线程的相关性已更改。

可能的原因

如果线程相关性在返回到线程池时发生更改,则会生成此停止。

应用程序验证程序显示的信息
  • 格式: - threadpool 线程 (%x) 已执行回调 (%p) 具有更改的线程关联掩码 (%p -> %p)
  • 参数 1 - Callback 函数。
  • 参数 2 - Context。
  • 参数 3 - Threadpool 对象分配堆栈跟踪,使用 dps 将其转储。
  • 参数 4 - 当前相关性。

其他信息
  • 测试层: Threadpool
  • 停止 ID: INCONSISTENT_AFFINITY_MASK
  • 停止代码: 700NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

当前线程的 msg 池中未处理的 msg。

可能的原因

如果此线程池线程返回到池时,任何消息都保留为未处理,则会生成此停止。 这是危险的,因为它将在完全不同的上下文中处理。 请使用 !avrf -tp <Param4> 查看发布到此线程的消息。

应用程序验证程序显示的信息
  • 格式: - threadpool 线程 (%x) 已执行的回调 (%p) 具有未完成的窗口消息 (%x: %x)
  • 参数 1 - Callback 函数。
  • 参数 2 - Context。
  • 参数 3 - Threadpool 对象分配堆栈跟踪,使用 dps 将其转储。
  • 参数 4 - Threadpool 线程 ID。请使用 !avrf -tp <threadid> 查看发布到此线程的消息。

其他信息
  • 测试层: Threadpool
  • 停止 ID: ORPHANED_THREAD_MESSAGE
  • 停止代码: 700NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

未封闭的窗口属于当前线程。

可能的原因

如果此线程池线程返回到池时,任何窗口保持活动状态,则会生成此停止。

应用程序验证程序显示的信息
  • 格式: -  线程池线程 (%x) 执行回调 (%p) 具有有效的 hwnd (%x: %s) ,可接收消息
  • 参数 1 - Callback 函数。
  • 参数 2 - Context。
  • 参数 3 - Threadpool 对象分配堆栈跟踪,使用 dps 将其转储。
  • 参数 4 - Threadpool 线程 ID。

其他信息
  • 测试层: Threadpool
  • 停止 ID: ORPHANED_THREAD_WINDOW
  • 停止代码: 700NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

线程池线程上的 ExitThread () 。

可能的原因

如果在线程池线程上调用 ExitThread,则会生成此停止。这是禁止的,因为它会使系统不稳定。 这将导致资源泄漏、冻结或 AV。

应用程序验证程序显示的信息
  • 参数 1 - Callback 函数。
  • 参数 2 - Context。
  • 参数 3 - Threadpool 对象分配堆栈跟踪,使用 dps 将其转储。
  • 参数 4 - 未使用。

其他信息
  • 测试层: Threadpool
  • 停止 ID: ILLEGAL_THREAD_EXIT
  • 停止代码: 700NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

当线程返回到线程池线程时,线程处于模拟状态。

可能的原因

如果回调函数更改了线程令牌以模拟其他用户,并且忘记了在将其返回给线程池之前重置它,则会生成此停止。

应用程序验证程序显示的信息
  • 参数 1 - Callback 函数。
  • 参数 2 - Context。
  • 参数 3 - Threadpool 对象分配堆栈跟踪,使用 dps 将其转储。
  • 参数 4 - 未使用。

其他信息
  • 测试层: Threadpool
  • 停止 ID: THREAD_IN_IMPERSONATION
  • 停止代码: 700NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

调用需要持久线程的函数。

可能的原因

某些 Microsoft Windows API 需要在专用或持久线程内调用。 在线程池中,通常应避免使用线程本地存储和排队需要持久线程的异步调用,例如 RegNotifyChangeKeyValue 函数。 但是,可以使用带有 WT_EXECUTEINPERSISTENTTHREAD 选项的 QueueUserWorkItem 将此类函数排队到持久性工作线程。 调试器中的 kb 将显示调用方。

应用程序验证程序显示的信息
  • 参数 1 - Callback 函数。
  • 参数 2 - Context。
  • 参数 3 - Threadpool 对象分配堆栈跟踪,使用 dps 将其转储。
  • 参数 4 - 未使用。

其他信息
  • 测试层: Threadpool
  • 停止 ID: PERSISTED_THREAD_NEEDED
  • 停止代码: 700NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

线程处于脏事务状态。

可能的原因

如果回调函数忘记关闭或重置当前事务句柄,则会生成此停止。

应用程序验证程序显示的信息
  • 参数 1 - Callback 函数。
  • 参数 2 - Context。
  • 参数 3 - Threadpool 对象分配堆栈跟踪,使用 dps 将其转储。
  • 参数 4 - 事务句柄。

其他信息
  • 测试层: Threadpool
  • 停止 ID: DIRTY_TRANSACTION_CONTEXT
  • 停止代码: 700NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

此线程池状态具有不平衡的 CoInit 和 CoUnInit 调用。

可能的原因

如果回调函数调用 CoInit 和 CoUnInit 不平衡,则会生成此停止。

应用程序验证程序显示的信息
  • 参数 1 - Callback 函数。
  • 参数 2 - Context。
  • 参数 3 - Threadpool 对象分配堆栈跟踪,使用 dps 将其转储。
  • 参数 4 - 均衡的调用计数。

其他信息
  • 测试层: Threadpool
  • 停止 ID: DIRTY_COM_STATE
  • 停止代码: 700NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

计时器对象的参数不一致。 创建计时器时指定WT_EXECUTEONLYONCE时,句点应为 0

可能的原因

如果当计时器设置为仅使用WT_EXECUTEONLYONCE标志发出一次信号时,发出计时器信号的时间段不为零,则生成此停止

应用程序验证程序显示的信息
  • 参数 1 - 指定的时间段。
  • 参数 2 指定了 - Flags。
  • 参数 3 - 未使用。
  • 参数 4 - 未使用。

其他信息
  • 测试层: Threadpool
  • 停止 ID: INCONSISTENT_TIMER_PARAMS
  • 停止代码: 700NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

加载程序锁已由回调中的线程池线程持有。

可能的原因

如果加载程序锁保留在回调中,并且不会在线程返回到线程池时释放,则会生成此停止。

应用程序验证程序显示的信息
  • 参数 1 - Callback 函数。
  • 参数 2 - Context。
  • 参数 3 - Threadpool 对象分配堆栈跟踪,使用 dps 将其转储。
  • 参数 4 - 未使用。

其他信息
  • 测试层: Threadpool
  • 停止 ID: LOADER_LOCK_HELD
  • 停止代码: 700NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

首选语言由回调中的线程池线程设置。

可能的原因

如果首选语言在回调中设置,并且当线程返回到线程池时未清除,则会生成此停止。

应用程序验证程序显示的信息
  • 参数 1 - Callback 函数。
  • 参数 2 - Context。
  • 参数 3 - Threadpool 对象分配堆栈跟踪,使用 dps 将其转储。
  • 参数 4 - 未使用。

其他信息
  • 测试层: Threadpool
  • 停止 ID: PREFERRED_LANGUAGES_SET
  • 停止代码: 700NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

后台优先级由回调中的线程池线程设置。

可能的原因

如果后台优先级在回调中设置,并且当线程返回到线程池时不禁用,则会生成此停止。

应用程序验证程序显示的信息
  • 参数 1 - Callback 函数。
  • 参数 2 - Context。
  • 参数 3 - Threadpool 对象分配堆栈跟踪,使用 dps 将其转储。
  • 参数 4 - 未使用。

其他信息
  • 测试层: Threadpool
  • 停止 ID: BACKGROUND_PRIORITY_SET
  • 停止代码: 700NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

线程池线程上的 TerminateThread () 。

可能的原因

如果在线程池线程上调用 TerminateThread,则会生成此停止。 这是禁止的,因为它会使系统不稳定。 这将导致资源泄漏、冻结或 AV。

应用程序验证程序显示的信息
  • 参数 1 - 未使用。
  • 参数 2 - 未使用。
  • 参数 3 - 未使用。
  • 参数 4 - 未使用。

其他信息
  • 测试层: Threadpool
  • 停止 ID: ILLEGAL_THREAD_TERMINATION
  • 停止代码: 700NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

异步 I/O 操作挂起时,堆栈已展开。

可能的原因

如果应用程序发出使用堆栈变量且未等待 I/O 完成的 I/O 操作,则生成此停止,从而导致堆栈损坏。 若要调试此停止:$ dps parameter4,以在发出 I/O 时显示堆栈跟踪。 Parameter1 指示基于堆栈的地址和参数 3 发出 I/O 的线程。

应用程序验证程序显示的信息
  • 参数 1 - I/O 中使用的堆栈变量的地址。
  • 参数 2 - 当前堆栈指针。
  • 参数 3 - 发出 I/O 的原始线程。
  • 参数 4 - 发出 I/O 时的堆栈跟踪。

其他信息
  • 测试层: Io
  • 停止 ID: ASYNCIO_STACK_UNWIND
  • 停止代码: 800NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

异步 I/O 操作挂起时堆栈已损坏。

可能的原因

如果应用程序发出使用堆栈变量且未等待 I/O 完成的 I/O 操作,则生成此停止,从而导致堆栈损坏。 若要调试此停止:$ dps parameter4,以在发出 I/O 时显示堆栈跟踪。 Parameter1 指示基于堆栈的地址和参数 3 发出 I/O 的线程。

应用程序验证程序显示的信息
  • 参数 1 - I/O 中使用的堆栈变量的地址。
  • 参数 2 - 当前堆栈指针。
  • 参数 3 - 发出 I/O 的原始线程。
  • 参数 4 - 发出 I/O 时的堆栈跟踪。

其他信息
  • 测试层: Io
  • 停止 ID: ASYNCIO_CORRUPTED_STACK
  • 停止代码: 800NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

在挂起的 I/O 操作中使用释放的地址。

可能的原因

如果应用程序发出 I/O 操作并在 I/O 完成之前释放了 I/O 中使用的内存,从而导致内存损坏等,则会生成此停止。若要调试此停止:$ dps parameter4,以在发出 I/O 时显示堆栈跟踪。 Parameter1 指示 I/O 中使用的地址。 Parameter2 指示释放的地址,参数 3 指示发出 I/O 的线程。

应用程序验证程序显示的信息
  • 参数 1 - I/O 中使用的地址。
  • 参数 2 - 正在释放的地址。
  • 参数 3 - 发出 I/O 的原始线程。
  • 参数 4 - 发出 I/O 时的堆栈跟踪。

其他信息
  • 测试层: Io
  • 停止 ID: FREED_ADDRESS_IN_PENDINGIO
  • 停止代码: 800NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

当关联的 I/O 请求仍处于挂起状态时,将重复使用 (重叠) 的 I/O 状态块。

可能的原因

如果应用程序重用了一个 I/O 状态块 (OVERLAPPED) 而使用该 I/O 状态块 (OVERLAPPED) 的 I/O 请求仍处于挂起状态,则会生成此停止。 若要调试此停止:$ dps parameter3,以在发出原始 I/O 时显示堆栈跟踪。 Parameter1 指示 I/O 中使用的地址,参数 2 指示发出 I/O 的线程。

应用程序验证程序显示的信息
  • 参数 1 - I/O 状态块的地址 (重叠) 。
  • 参数 2 - 发出 I/O 的原始线程。
  • 参数 3 - 发出 I/O 时的堆栈跟踪。
  • 参数 4 - 未使用。

其他信息
  • 测试层: Io
  • 停止 ID: REUSED_IOSTATUS_BLOCK
  • 停止代码: 800NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

使用不受支持的标志,在 CreateFile 上FILE_ATTRIBUTE_NOT_CONTENT_INDEXED

可能的原因

旧版 MSDN 错误地将 CreateFile 记录为支持FILE_ATTRIBUTE_NOT_CONTENT_INDEXED。 如果打算使用此标志,则应使用其他 API 函数(如 SetFileAttributes)对其进行设置。 $ ln Parameter1,用于查找 CreateFile 的调用方。

应用程序验证程序显示的信息
  • 格式: -  使用 %08x %08x %08x %08x 的标志编写 %hs%ws 时创建文件
  • 参数 1 - Return Address。
  • 参数 2 - 未使用。
  • 参数 3 - 未使用。
  • 参数 4 - 未使用。

其他信息
  • 测试层: Io
  • 停止 ID: USING_BAD_CREATEFILE_FLAG
  • 停止代码: 800NAN
  • 严重性: 警告
  • 一次性错误: 
  • 错误报告: 没有
  • 记录到文件: 是的
  • 创建回溯: 是的

堆分配泄漏。

可能的原因

如果分配的所有者 dll 在拥有资源时动态卸载,则会生成此停止。

应用程序验证程序显示的信息
  • 参数 1 - 泄漏的分配的地址。 运行 !heap -p -a <address> 以获取有关分配的其他信息。
  • 参数 2 - 分配堆栈跟踪的地址。 运行 dps <地址> 以查看分配堆栈。
  • 参数 3 - 所有者 dll 名称的地址。 运行 du <address> 读取 dll 名称。
  • 参数 4 - 所有者 dll 的基。 运行 .reload <dll_name> = <address> 重新加载所有者 dll。 使用“lm”获取有关已加载和卸载模块的详细信息。

其他信息
  • 测试层: 泄漏
  • 停止 ID: 分配
  • 停止代码: 900NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

句柄泄漏。

可能的原因

如果在拥有资源时动态卸载句柄的所有者 dll,则会生成此停止。 若要调试此停止,请运行 !htrace parameter1 以获取有关句柄的其他信息。

应用程序验证程序显示的信息
  • 参数 1 - 泄漏句柄的值。 如果启用了句柄跟踪,>请运行 !htrace <句柄以获取有关句柄的其他信息。
  • 参数 2 - 分配堆栈跟踪的地址。 运行 dps <地址> 以查看分配堆栈。
  • 参数 3 - 所有者 dll 名称的地址。 运行 du <address> 读取 dll 名称。
  • 参数 4 - 所有者 dll 的基。 运行 .reload <dll_name> = <address> 重新加载所有者 dll。 使用“lm”获取有关已加载和卸载模块的详细信息。

其他信息
  • 测试层: 泄漏
  • 停止 ID: 处理
  • 停止代码: 900NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

HKEY 泄漏。

可能的原因

如果注册表项的所有者 dll 在拥有资源时动态卸载,则会生成此停止。

应用程序验证程序显示的信息
  • 参数 1 - 泄漏的 HKEY 的值。
  • 参数 2 - 分配堆栈跟踪的地址。 运行 dps <地址> 以查看分配堆栈。
  • 参数 3 - 所有者 dll 名称的地址。 运行 du <address> 读取 dll 名称。
  • 参数 4 - 所有者 dll 的基。 运行 .reload <dll_name> = <address> 重新加载所有者 dll。 使用“lm”获取有关已加载和卸载模块的详细信息。

其他信息
  • 测试层: 泄漏
  • 停止 ID: 注册 表
  • 停止代码: 900NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

虚拟预留已泄露。

可能的原因

如果在拥有资源时动态卸载虚拟预留的所有者 dll,则会生成此停止。

应用程序验证程序显示的信息
  • 参数 1 - 已泄漏预留地址。
  • 参数 2 - 分配堆栈跟踪的地址。 运行 dps <地址> 以查看分配堆栈。
  • 参数 3 - 所有者 dll 名称的地址。 运行 du <address> 读取 dll 名称。
  • 参数 4 - 所有者 dll 的基。 运行 .reload <dll_name> = <address> 重新加载所有者 dll。 使用“lm”获取有关已加载和卸载模块的详细信息。

其他信息
  • 测试层: 泄漏
  • 停止 ID: VIRTUAL_RESERVATION
  • 停止代码: 900NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

BSTR 泄露。

可能的原因

如果 SysString 的所有者 dll 在拥有资源时动态卸载,则会生成此停止。

应用程序验证程序显示的信息
  • 参数 1 - 泄漏的 BSTR 的地址。 运行 !heap -p -a <address> 以获取有关分配的其他信息。
  • 参数 2 - 分配堆栈跟踪的地址。 运行 dps <地址> 以查看分配堆栈。
  • 参数 3 - 所有者 dll 名称的地址。 运行 du <address> 读取 dll 名称。
  • 参数 4 - 所有者 dll 的基。 运行 .reload <dll_name> = <address> 重新加载所有者 dll。 使用“lm”获取有关已加载和卸载模块的详细信息。

其他信息
  • 测试层: 泄漏
  • 停止 ID: SYSSTRING
  • 停止代码: 900NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

未注销电源通知。

可能的原因

如果 dll 已注册电源通知并且动态卸载且未注销,则会生成此停止。

应用程序验证程序显示的信息
  • 参数 1 - 电源通知注册的地址。
  • 参数 2 - 注册堆栈跟踪的地址。 运行 dps <地址> 以查看分配堆栈。
  • 参数 3 - 所有者 dll 名称的地址。 运行 du <address> 读取 dll 名称。
  • 参数 4 - 所有者 dll 的基。 运行 .reload <dll_name> = <address> 重新加载所有者 dll。 使用“lm”获取有关已加载和卸载模块的详细信息。

其他信息
  • 测试层: 泄漏
  • 停止 ID: POWER_NOTIFICATION
  • 停止代码: 900NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

COM 分配泄漏。

可能的原因

如果 COM 分配的所有者 dll 在拥有资源时动态卸载,则会生成此停止。

应用程序验证程序显示的信息
  • 参数 1 - 泄漏的 COM 分配的地址。 运行 !heap -p -a <address> 以获取有关分配的其他信息。
  • 参数 2 - 分配堆栈跟踪的地址。 运行 dps <地址> 以查看分配堆栈。
  • 参数 3 - 所有者 dll 名称的地址。 运行 du <address> 读取 dll 名称。
  • 参数 4 - 所有者 dll 的基。 运行 .reload <dll_name> = <address> 重新加载所有者 dll。 使用“lm”获取有关已加载和卸载模块的详细信息。

其他信息
  • 测试层: 泄漏
  • 停止 ID: COM_ALLOCATION
  • 停止代码: 900NAN
  • 严重性: 错误
  • 一次性错误: 
  • 错误报告: 打破
  • 记录到文件: 是的
  • 创建回溯: 是的

另请参阅

应用程序验证工具 - 停止代码和定义

应用程序验证程序 - 概述

应用程序验证工具 - 功能

应用程序验证工具 - 测试应用程序

应用程序验证工具 - 应用程序验证工具中的测试

应用程序验证工具 - 调试应用程序验证工具停止

应用程序验证工具 - 常见问题解答