当我使用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:\dd\vctools\crt_bld\self_64_amd64\crt\src\invarg.c @ 156] 00007ff7`13fe03f4 ff159ebe0000 call qword ptr [AKC!_imp_GetCurrentProcess (00007ff7`13fec298)] FAULTING_SOURCE_LINE: f:\dd\vctools\crt_bld\self_64_amd64\crt\src\invarg.c FAULTING_SOURCE_FILE: f:\dd\vctools\crt_bld\self_64_amd64\crt\src\invarg.c FAULTING_SOURCE_LINE_NUMBER: 156 FAULTING_SOURCE_CODE: No source found for 'f:\dd\vctools\crt_bld\self_64_amd64\crt\src\invarg.c' SYMBOL_STACK_INDEX: 0 SYMBOL_NAME: akc!_invoke_watson+18
Hans Passant.. 11
_invoke_watson()
是一个内部Microsoft C运行时函数,崩溃了您的程序.这就是让你看看这个迷你车的原因.不告诉你任何有趣的事情,你必须看看堆栈跟踪,看看它是如何到达那里的.问题始于:
AKC!swprintf_s<260>+0x25
注意_s
函数名的后缀,它是swprintf()的安全版本.它确保sprintf()无法写入缓冲区的末尾.它确实写了缓冲区的末尾,这就是引发崩溃的原因.您还可以从模板名称中查看缓冲区大小,260个字符.
这是Windows中的一个神奇数字,它是MAX_PATH的值.为您提供一个非常好的理论,为什么程序崩溃,它可能被要求处理包含超过259个字符的文件名.通常,C和C++程序在处理Windows上的文件系统时非常困难,因为它能够创建最多32,767个字符的路径.Backgrounder 就在这里.
除了在程序中添加检查以确保不超过此限制,因此您可以提供更好的诊断,告知客户端重新组织其数据并避免将文件存储在深层嵌套目录中是最简单的解决方法.
_invoke_watson()
是一个内部Microsoft C运行时函数,崩溃了您的程序.这就是让你看看这个迷你车的原因.不告诉你任何有趣的事情,你必须看看堆栈跟踪,看看它是如何到达那里的.问题始于:
AKC!swprintf_s<260>+0x25
注意_s
函数名的后缀,它是swprintf()的安全版本.它确保sprintf()无法写入缓冲区的末尾.它确实写了缓冲区的末尾,这就是引发崩溃的原因.您还可以从模板名称中查看缓冲区大小,260个字符.
这是Windows中的一个神奇数字,它是MAX_PATH的值.为您提供一个非常好的理论,为什么程序崩溃,它可能被要求处理包含超过259个字符的文件名.通常,C和C++程序在处理Windows上的文件系统时非常困难,因为它能够创建最多32,767个字符的路径.Backgrounder 就在这里.
除了在程序中添加检查以确保不超过此限制,因此您可以提供更好的诊断,告知客户端重新组织其数据并避免将文件存储在深层嵌套目录中是最简单的解决方法.