缘起
曾经在 2022 年分析过一个崩溃转储,文章在这里。在那个案例中,堆空间大小将近 4GB。根据上次的结论,这应该是一个运行在 64 位系统下的 32 位进程崩溃产生的转储文件。这让我有了一个疑问?怎么从进程转储文件中得知进程是 32 位的还是 64 位的?如果是 32 位进程,怎么判断是运行在 32 位系统上还是运行在 64 位系统上呢?
经常做调试的朋友可能会遇到在 windbg 里通过 k 系列命令得到的调用栈没有太大参考意义。一般是由于线程上下文不对导致的。这时候可以通过 !analyze -v 让 windbg 自动帮我们分析出正确的调用栈及异常发生时的线程上下文。有了上下文信息,就可以执行 .cxr address_to_context 命令切换上下文,这时候再通过 k 命令查看调用栈,一般可以得到一个有意义的调用栈。
但有时候 !analyze -v 分析出来的上下文信息也是不对的。这时候就需要我们自己手动查找异常上下文了。
这不,最近我就遇到了一个需要手动查找异常上下文的情况。经过调查发现了一个非常重要的规律 —— 64 位程序中,KiUserExceptionDispatcher 函数对应栈帧的 Child-SP 的值保存了异常发生时的线程上下文。
本文完整记录了整个查找验证的过程。
吐槽:
64位程序的参数传递方式与32位程序大不相同,不能根据ebp定位参数了。而是需要结合反汇编代码来推断某个函数的参数是否保存到栈上。如果没保存到栈上,基本上很难找到相关参数了。
今天查资料的时候,偶然发现了一位国外网友镜像了 TheOleNewThing 从 2003 年到 2019 年的博文,竟然有 5000 多篇(真是高产)。值得注意的是,微软官方博客中许多链接都已经失效了。为了防止这位网友的镜像链接也失效,我决定赶紧将这些内容下载保存下来。手动保存显然不现实,毕竟有 5000 多篇文章呢!所以,我决定写脚本来自动下载,这才是明智之举!如果是几年前,我肯定要亲自动手写脚本,不过如今,AI 这么强大,我无需再费力。幸运的是,我利用 Cursor 自动生成下载脚本的全过程,并对其进行了简单的修改,成功地将全部 5000 多篇文章下载并压缩存档,并按年月分类打包好了!不得不赞叹一句,AI 真是太强大了。
Yarden Shafir 分享了两篇非常通俗易懂的,关于 windbg 新引入的调试数据模型的文章。原文链接如下:
part1:https://medium.com/@yardenshafir2/windbg-the-fun-way-part-1-2e4978791f9b
part2:https://medium.com/@yardenshafir2/windbg-the-fun-way-part-2-7a904cba5435
本文是第二部分的译文。同样在有道词典、必应词典、谷歌翻译的大力帮助下完成,感谢以上翻译工具,我只是一个搬运工。强烈建议英文好的朋友阅读原文,因为在翻译的过程中不可避免的按我的理解做了调整。
第一部分译文在这里。
以下是译文!
Yarden Shafir 分享了两篇非常通俗易懂的,关于 windbg 新引入的调试数据模型的文章。链接如下:
part1:https://medium.com/@yardenshafir2/windbg-the-fun-way-part-1-2e4978791f9b
part2:https://medium.com/@yardenshafir2/windbg-the-fun-way-part-2-7a904cba5435
本文是第一部分的译文。在有道词典、必应词典、谷歌翻译的大力帮助下完成,感谢以上翻译工具,我只是一个搬运工。强烈建议英文好的朋友阅读原文,因为在翻译的过程中不可避免的按我的理解做了调整。