最近因团队下一个开发工程师的WPF应用存在偶尔卡顿的现象,重新温习了下windbg的知识,此次记录备忘下,以下是整理的思维导图,有点乱,哈哈。
FAQ
运行!address -summary时,提示错误 ntdll.dll not found
查过网上不少文章没解决,一直以为是symbol的问题。 后来研究发现,程序是32位的,并运行在64位的win10专业版,并用32位的任务管理器去dump文件导致,正确的做法是用64位的任务管理器去dump,然后用64位的windbg打开。但这里会带来另外一个问题。
.loadby sos clr
The call to LoadLibrary(C:\Windows\Microsoft.NET\Framework\v4.0.30319\sos.dll) failed, Win32 error 0n193
"%1 不是有效的 Win32 应用程序。"
因为.net用的是32位的,而这个dump文件是用64位任务管理器dump的,所以无法加载sos, 正确的解决办法就是,再用32位的管理器去dump,用32位的windbg打开即可解决。所以针对这种特殊情况,要做两次不同的dump, 分别进行分析,前者可以分析unmanaged的, 后者分析managed.
Analyze
请直接看看下面的文章,都写的很全很详细。
参考的文章:
Windows SDK - Windows 应用开发 | Microsoft DeveloperWindows SDK for Windows 11 包含可在创建在 Windows 上运行的应用时使用的标头、库和工具。https://developer.microsoft.com/zh-cn/windows/downloads/windows-sdk/ 记一次 .NET 某游戏服务后端 内存暴涨分析_windbg .net 内存-优快云博客文章浏览阅读219次。可以仔细想一想,没有被 GC 回收,从侧面也表明它可能刚分配不久,并且是一个局部变量,既然是局部变量,就可以反向找到是哪一个线程分配的,如果线程栈还残留着返回地址信息,就可以反推出是哪一个方法,有了这个思路,接下来就可以动手挖了。按照编码人的习惯,肯定是某一个集合,可以用内存搜索解决。0:000>!从卦中看,果然用的是一个集合,万事开头难,接下来继续反向搜索,如果线程栈还有残留的话,就可以找到它所属的线程栈。0:000>!从卦中的信息来看,它是属于0号线程,如果你不相信的话,可以拿417d1000。_windbg .net 内存
https://blog.youkuaiyun.com/huangxinchen520/article/details/131700140
用Windbg来分析.Net程序的dump-腾讯云开发者社区-腾讯云介绍1. 什么是WindbgWinDbg是微软发布的一款相当优秀的源码级(source-level)调试工具,可以用于Kernel模式调试和用户模式调试,还可以调试Dump文件。WinDbg是微软很重要的诊断调试工具: 可以查看源代码、设置断点、查看变量, 查看调用堆栈及内存情况。Dump文件是进程的内存镜像,...https://cloud.tencent.com/developer/article/1113533?areaSource=102001.8&traceId=x75ve9MZcSMAHWxGHdwxM https://www.cnblogs.com/tianqing/p/13197382.html
https://www.cnblogs.com/tianqing/p/13197382.html
https://www.cnblogs.com/hzwanglw/p/13285499.htmlhttps://www.cnblogs.com/hzwanglw/p/13285499.html