我的应用程序崩溃了。所以我使用windbg来检查跟踪日志。这是我在windbg中的跟踪日志:
FAILED_INSTRUCTION_ADDRESS:
cbmwk5!unloaded+161c0
727261c0 ?? ???
ANALYSIS_VERSION: 6.3.9600.17298 (debuggers(dbg).141024-1500) amd64fre
LAST_CONTROL_TRANSFER: from 423c1d76 to 72725817
IP_MODULE_UNLOADED:
cbmwk5!unloaded+15817
72725817 ?? ???
PRIMARY_PROBLEM_CLASS: BAD_INSTRUCTION_PTR_NULL
DEFAULT_BUCKET_ID: BAD_INSTRUCTION_PTR_NULL
STACK_TEXT:
023eebfc 72725817 cbmwk5!unloaded+0x15817
023eec00 423c1d76 unknown!unknown+0x0
023eec30 7272590a cbmwk5!unloaded+0x1590a
023eec58 72723a39 cbmwk5!unloaded+0x13a39
023ef120 76b65762 shell32!SHGetFolderPathW+0x180
023ef128 72720813 cbmwk5!unloaded+0x10813
023ef144 7271110e cbmwk5!unloaded+0x110e
023ef164 72715916 cbmwk5!unloaded+0x5916
023ef59c 7271636b cbmwk5!unloaded+0x636b
你能帮我看看如何根据STACK_TEXT检查cbmwk5.dll的大小吗? " + 0x15817"是什么意思?在声明中:
023eebfc 72725817 cbmwk5!unloaded+0x15817
我尝试使用命令重新加载:
.reload /unl cbmwk5.dll
然后输入:!analyze -v 但缺少cbmwk5.dll的错误发生:
SYMSRV: c:\localsymbols\cbmwk5.dll\506DCE083b000\cbmwk5.dll not found
SYMSRV: http://msdl.microsoft.com/download/symbols/cbmwk5.dll/506DCE083b000/cbmwk5.dll not found
DBGHELP: C:\Program Files (x86)\Windows Kits\8.1\Debuggers\cbmwk5.dll - file not found
DBGENG: cbmwk5.dll - Image mapping disallowed by non-local path.
DBGHELP: No header for cbmwk5.dll. Searching for dbg file
DBGHELP: .\cbmwk5.dbg - file not found
DBGHELP: .\dll\cbmwk5.dbg - path not found
DBGHELP: .\symbols\dll\cbmwk5.dbg - path not found
DBGHELP: cbmwk5.pdb - file not found
*** WARNING: Unable to verify timestamp for cbmwk5.dll
*** ERROR: Module load completed but symbols could not be loaded for cbmwk5.dll
DBGHELP: cbmwk5 - no symbols loaded
DBGHELP: C:\Program Files (x86)\Windows Kits\8.1\Debuggers\cbmwk5.dll - file not found
SYMSRV: C:\Program Files (x86)\Windows Kits\8.1\Debuggers\x64\sym\cbmwk5.dll\506DCE083b000\cbmwk5.dll not found
非常感谢。
答案 0 :(得分:4)
语句
中“+ 0x15817”的含义是什么
+ 0x15817意味着调试器无论如何调用哪个函数都没有任何线索。它只是对DLL没有任何了解,只知道它曾经加载过的地方。因此它只能使用DLL名称和非常大的偏移量来注释地址。从SYMSRV跟踪消息中可以看到,调试器尝试下载DLL的PDB文件,但符号服务器不知道有关DLL的任何信息。这肯定不常见,它是第三方DLL,而不是微软的。甚至谷歌也从未听说过它。
FAILED_INSTRUCTION_ADDRESS:
cbmwk5!卸载+ 161c0
unloaded
注释是您解决问题的最有力线索。代码崩溃是因为DLL是从内存中卸载的。然而程序试图调用它。没有代码可以执行(注意??
),处理器被迫放弃并生成访问冲突。那是该计划的结束,它无法继续运作。
023ef120 76b65762 shell32!SHGetFolderPathW + 0x180
堆栈跟踪给出了潜在问题的(弱)线索。请注意这是猜测。但是像SHGetFolderPathW()这样的shell函数的存在强烈暗示这是一个行为不端的shell扩展。它们可以造成很大的破坏,因为当你使用常见的shell对话框(如OpenFileDialog)时,它们往往被注入到程序中。换句话说,它与你的程序没有任何关系,而是其他人的蹩脚代码使程序炸弹。
通过逐个禁用shell扩展来解决此类问题,直到问题消失。 SysInternals的AutoRuns实用程序是首选武器。它必须由机器所有者完成,除了提供建议外,你几乎无能为力。