当前位置:  开发笔记 > 编程语言 > 正文

WinDbg中的_invoke_watson是什么?

如何解决《WinDbg中的_invoke_watson是什么?》经验,为你挑选了1个好方法。

当我使用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 就在这里.

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



1> Hans Passant..:

_invoke_watson()是一个内部Microsoft C运行时函数,崩溃了您的程序.这就是让你看看这个迷你车的原因.不告诉你任何有趣的事情,你必须看看堆栈跟踪,看看它是如何到达那里的.问题始于:

   AKC!swprintf_s<260>+0x25 

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

这是Windows中的一个神奇数字,它是MAX_PATH的值.为您提供一个非常好的理论,为什么程序崩溃,它可能被要求处理包含超过259个字符的文件名.通常,C和C++程序在处理Windows上的文件系统时非常困难,因为它能够创建最多32,767个字符的路径.Backgrounder 就在这里.

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

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有