检查windbg中的dll大小

时间:2015-03-20 08:37:28

标签: c++ windbg

我的应用程序崩溃了。所以我使用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

非常感谢。

1 个答案:

答案 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实用程序是首选武器。它必须由机器所有者完成,除了提供建议外,你几乎无能为力。