首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >_invoke_watson in WinDbg是什么?

_invoke_watson in WinDbg是什么?
EN

Stack Overflow用户
提问于 2015-12-22 07:28:13
回答 1查看 4.2K关注 0票数 5

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

代码语言:javascript
运行
复制
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
EN

回答 1

Stack Overflow用户

发布于 2015-12-22 09:17:29

_invoke_watson()是一个内部Microsoft运行时函数,它使您的程序崩溃。这就是让你看这个小傻瓜的原因。没有告诉您任何有趣的事情,您必须查看堆栈跟踪,看看它是如何到达那里的。问题的起因是:

代码语言:javascript
运行
复制
   AKC!swprintf_s<260>+0x25 

注意函数名的_s后缀,它是swprintf()的secure version。它确保sprintf()不能写入缓冲区的末尾。确实在缓冲区结束后编写了,这就是引发崩溃的原因。您还可以从模板名(260个字符)中看到缓冲区大小。

这在Windows中是一个神奇的数字,它是MAX_PATH的值。为您提供了一个很好的理论,为什么程序崩溃,它可能被要求处理一个文件名,其中包含超过259字符。通常情况下,C和C++程序很难处理Windows上的文件系统,因为它们能够创建多达32,767个字符的路径。背景资料is here.

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

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34410561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档