WinDbg中的_invoke_watson是什么
What is _invoke_watson in WinDbg?
当我使用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个字符的路径。背景在这里。
除了在程序中添加检查以确保不会超过此限制从而提供更好的诊断外,告诉客户端重新组织数据并避免将文件存储在深度嵌套的目录中是最简单的解决方法。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 通过JNI传递数据数组的最快方法是什么
- "using namespace std;"在C++的作用是什么?
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 文件系统:复制功能的速度秘诀是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 是什么原因导致它无法编译?它是声明签名还是在函数本身的实现中
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么