WinDbg中的_invoke_watson是什么

What is _invoke_watson in WinDbg?

本文关键字:是什么 watson invoke WinDbg 中的      更新时间:2023-10-16

当我使用WinDbg分析我们的问题时,我发现了跟踪"AKC!_invoke_watson"。你能帮我解释一下什么是"_invoke_watson"吗?如何知道基于此跟踪的AKC应用程序的根本原因是什么?

DEFAULT_BUCKET_ID:  NULL_POINTER_READ_IN_CALL
LAST_CONTROL_TRANSFER:  from 00007ff713fe047e to 00007ff713fe03f4
STACK_TEXT:  
00000000`0274efe0 00007ff7`13fe047e : 00000000`024a36d8 00000000`ce9f27b4 00000000`024a1ac0 00007ff7`13fe3162 : AKC!_invoke_watson+0x18
00000000`0274f010 00007ff7`13fe0499 : 00000000`00000130 00000000`0274f190 00000000`ffffffff 00000000`0274f120 : AKC!_invalid_parameter+0x6e
00000000`0274f050 00007ff7`13fe28a6 : 00000000`00000068 00000000`00000000 00000000`00000225 00000000`0000002a : AKC!_invalid_parameter_noinfo+0x19
00000000`0274f090 00007ff7`13fdab91 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : AKC!_woutput_s_l+0xb42
00000000`0274f5b0 00007ff7`13fdac52 : 00000000`024a36d8 00000000`00000409 00000000`00000000 00000000`00000000 : AKC!_vswprintf_helper+0x9d
00000000`0274f620 00007ff7`13fdac9d : 00000000`024a34b0 00000000`00000000 00000000`00000000 00000000`00000000 : AKC!_vswprintf_s_l+0x42
00000000`0274f660 00007ff7`13fd7885 : 00000000`0000003e 00000000`024a34b0 00000000`00000000 00000000`00000409 : AKC!vswprintf_s+0x11
00000000`0274f6a0 00007ff7`13fd40a1 : 00000000`024a34b0 00000000`0274f730 00000000`024a3f90 00000000`024a1a70 : AKC!swprintf_s<260>+0x25
00000000`0274f6d0 00007ff7`13fd48b6 : 00000000`00000026 00000000`024a34b0 00000000`024a34b0 00007ff7`13ff0550 : AKC!Capture::initTag+0xf1
00000000`0274f980 00007ff7`13fd345e : 00000000`00000000 00000000`024a34b0 00000000`00000026 00000000`000000c8 : AKC!Capture::funcShow+0x56
00000000`0274f9b0 00007ffc`21e815dd : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : AKC!Capture::Loop+0x50e
00000000`0274fa50 00007ffc`229d43d1 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : kernel32!BaseThreadInitThunk+0xd
00000000`0274fa80 00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!RtlUserThreadStart+0x1d

FOLLOWUP_IP: 
AKC!_invoke_watson+18 [f:ddvctoolscrt_bldself_64_amd64crtsrcinvarg.c @ 156]
00007ff7`13fe03f4 ff159ebe0000    call    qword ptr [AKC!_imp_GetCurrentProcess (00007ff7`13fec298)]
FAULTING_SOURCE_LINE:  f:ddvctoolscrt_bldself_64_amd64crtsrcinvarg.c
FAULTING_SOURCE_FILE:  f:ddvctoolscrt_bldself_64_amd64crtsrcinvarg.c
FAULTING_SOURCE_LINE_NUMBER:  156
FAULTING_SOURCE_CODE:  
No source found for 'f:ddvctoolscrt_bldself_64_amd64crtsrcinvarg.c'

SYMBOL_STACK_INDEX:  0
SYMBOL_NAME:  akc!_invoke_watson+18

_invoke_watson()是一个内部的Microsoft C运行时函数,它使您的程序崩溃。正是它让你看到了这个小垃圾场。不会告诉你任何有趣的事情,你必须查看堆栈跟踪,看看它是如何到达那里的。故障开始于:

   AKC!swprintf_s<260>+0x25 

注意函数名的_s后缀,它是swprintf()的安全版本。它确保sprintf()不能写入超过缓冲区的末尾。它确实写过了缓冲区的末尾,这就是触发崩溃的原因。您还可以从模板名称中看到缓冲区大小,260个字符。

在Windows中,这是一个神奇的数字,它是MAX_PATH的值。为您提供了一个很好的理论来解释程序崩溃的原因,它可能被要求处理包含超过259个字符的文件名。通常,C和C++程序在处理Windows上的文件系统时会遇到非常困难的情况,因为它们能够创建最多32767个字符的路径。背景在这里。

除了在程序中添加检查以确保不会超过此限制从而提供更好的诊断外,告诉客户端重新组织数据并避免将文件存储在深度嵌套的目录中是最简单的解决方法。