你生成的转储文件有问题吗?

原总结debug调试dump转储文件windbgprocdump

如果你还不清楚什么是转储文件,不知道什么时候需要转储文件,请参考转储文件系列文章的第一篇 —— 转储文件知多少

前言

细心的小伙伴可能注意到了,我在上一篇介绍抓取转储文件的工具的文章 —— 你需要知道的 N 种抓取 dump 的工具 中提到了:

如果用 64 位的 windbg 附加到 32 位目标进程后,直接执行.dump 命令生成的转储文件会 “有问题”。

经常抓 dump 的小伙伴很可能遇到过这个问题。具体是什么问题呢?我们一起看看吧。

问题

还记得 N 年前,我用任务管理器抓取 32 位进程的转储文件后,使用 windbg 分析时,傻眼了!全是wow64 相关的栈帧,一个我关心的栈帧都没有。大概就像下图这样。(配图是我新截的,第一次分析时没保存截图)

有问题的调用栈

我所指的 “有问题”,就是指的这个问题。你知道怎么解决吗?

小知识

x64 系统中,如果我们用系统自带的任务管理器为目标进程创建转储文件,不论目标进程是 32 位,还是 64 位,任务管理器将始终创建 64 位的转储文件。为 32 位进程创建的转储文件会包含 WoW64 子系统的信息,我们用 windbg 分析的时候,可能会遇到上文中提到的问题。下面是同一个 32 位进程的转储文件的调用栈截图。

第一张截图是直接使用 k 命令得到的结果。可以看到很诡异。

有问题的调用栈

第二张截图是使用 .load 命令加载 wow64exts 扩展后,使用其 !sw 命令切换模式后,再使用 k 命令得到的结果。可以看到,结果很完美。

正常的调用栈

对,wow64exts 是我们的解决之道。如果你像曾经的我一样,不知道使用 wow64exts!sw 命令切换模式进行调试的话,是不是就 “有问题” 了?每次都手动加载 wow64exts,然后用 !sw 命令切换模式岂不是很麻烦?我们可以在加载 wow64exts 模块后,直接使用 !wow64exts.k 查看调用栈,这里就不截图了。还有更省心的办法吗?如果用 k 命令能直接看到想看的调用栈岂不是更好?有,不过我们抓取转储文件的时候需要有讲究。

{% note info%}

2020-01-11 更新:

群里大佬提醒,也可以使用 .effmach 命令来查看或切换调试器使用的处理器模式。我们可以使用 .effmach x86 来强制切换到 x86 模式下,然后再执行 k 命令。效果和 .load wow64exts; !sw; k 一样。 大家可以试一下。关于 .effmach 的帮助,请参考微软官方文档,或者直接参考下面的截图。

截自微软官方文档

{%endnote%}

procdump

x64 位系统下,procdump 默认对 32 进程创建 32 位的转储文件。这样做的好处是,生成的转储文件中不包含 WOW64 子系统的相关信息。我们用 windbg 分析转储文件时,可以直接使用 k 系列命令查看调用栈,不需要借助 wow64exts 的帮助了,这样调试起来更简单直接。

为了更直观的感受 procdump 的好处,我专门录制了两段视频。第一段是使用 windbg 分析 procdump32 位进程生成的转储文件,第二段是使用 windbg 分析任务管理器为同一个 32 位进程生成的转储文件。

调试 procdump 生成的 dump

调试任务管理生成的 dump

相信大家可以直观的感受到,调试 procdump 生成的转储文件的时候,非常直接。调试任务管理器生成的转储文件的时候,需要借助 wow64exts 的帮助才可以看到正常的调用栈。

{% note info%}

说明:

使用 procdump 默认选项生成的转储文件中不包含 WoW64 相关的信息。如果需要调试涉及 WoW64 子系统的故障,可以在运行 procdump 的时候加上 -64 选项,这样为 32 位进程生成的转储文件就包含 WoW64 子系统的信息了。我们绝大多数情况下不会调试 WoW64子系统相关的故障,所以就使用默认选项吧。

{%endnote%}

总结

  • windbg 中,使用 ! 来调用扩展中的命令。
  • 使用 procdump 默认选项为 32 位进程生成的转储文件不包含 WoW64 信息,绝大多数情况下更便于我们调试。
  • 如果需要,在使用 procdump 抓取转储文件时,我们可以使用 -64 选项为 32 位进程抓取包含 Wow64 相关信息的转储文件。
  • 调试包含 WoW64 信息的转储文件,可以使用 .load 命令加载 wow64exts模块,并调用其 !sw 命令切换模式,然后就可以正常调试了。
  • 直接使用 .effmach 命令可以显示当前的处理器模式,.effmach x86 | x64 可以显示切换模式。

参考资料

原文地址:https://www.cnblogs.com/bianchengnan/p/12253558.html

时间: 2024-11-10 01:29:39

你生成的转储文件有问题吗?的相关文章

使用 Eclipse Memory Analyzer 进行堆转储文件分析

Eclipse Memory Analyzer(MAT)是著名的跨平台集成开发环境 Eclipse Galileo 版本的 33 个组成项目中之一,它是一个功能丰富的 JAVA 堆转储文件分析工具,可以帮助你发现内存漏洞和减少内存消耗.本文主要介绍如何安装配置 Memory Analyzer,并结合一个实例,介绍如何利用 MAT 来进行堆转储文件分析,找到内存泄露的根源. 0 评论: 仇 璐, 软件工程师, IBM 杨 晓峰, 软件工程师, IBM 2010 年 7 月 22 日 内容 在 IB

Eclipse Memory Analyzer 进行堆转储文件分析

概述 对于大型 JAVA 应用程序来说,再精细的测试也难以堵住所有的漏洞,即便我们在测试阶段进行了大量卓有成效的工作,很多问题还是会在生产环境下暴露出来,并且很难在测试环境中进行重现.JVM 能够记录下问题发生时系统的部分运行状态,并将其存储在堆转储 (Heap Dump) 文件中,从而为我们分析和诊断问题提供了重要的依据. 通常内存泄露分析被认为是一件很有难度的工作,一般由团队中的资深人士进行.不过,今天我们要介绍的 MAT(Eclipse Memory Analyzer)被认为是一个“傻瓜式

当地使用impdp导出服务器转储文件,本地使用impdp导入远程数据库用户

本地使用impdp导出服务器转储文件,本地使用impdp导入远程数据库用户 1)expdp是可以在客户端上生成转储文件的 2)impdp是可以在不同的实例之间进行数据的迁移复制的 练习1: 1)将远程数据库WSJB用户使用expdp命令导出到本地磁盘的D:\下 Microsoft Windows [版本 6.1.7600] 版权所有 (c) 2009 Microsoft Corporation.保留所有权利. C:\windows\system32>sqlplus system/system S

Eclipse Memory Analysis进行堆转储文件分析

生成堆转储文件 1.新建项目,设置Eclispe Java堆的大小: (1)限制Java堆大小:将最小值 -Xms参数与最大值-Xmx参数设置一样可避免堆的扩展 -Xmx20m -Xms20m -Xmn10m -Xss1m (2)通过参数:-XX:+HeapDumpOnOutOfMemoryError,可以让VM在出现内存溢出异常时Dump当前内存堆转储快照         -Xmx20m -Xms20m -Xmn10m -Xss1m -XX:+HeapDumpOnOutOfMemoryErro

[Android Memory] 使用 Eclipse Memory Analyzer 进行堆转储文件分析

转载地址:http://www.ibm.com/developerworks/cn/opensource/os-cn-ecl-ma/index.html Eclipse Memory Analyzer(MAT)是著名的跨平台集成开发环境 Eclipse Galileo 版本的 33 个组成项目中之一,它是一个功能丰富的 JAVA 堆转储文件分析工具,可以帮助你发现内存漏洞和减少内存消耗.本文主要介绍如何安装配置 Memory Analyzer,并结合一个实例,介绍如何利用 MAT 来进行堆转储文

linux下生成core dump文件方法及设置【转】

转自:http://blog.csdn.net/mrjy1475726263/article/details/44116289 源自:http://andyniu.iteye.com/blog/1965571 core dump的概念: A core dump is the recorded state of the working memory of a computer program at a specific time, generally when the program has te

生成jvm快照文件

原文:https://blog.csdn.net/jijianshuai/article/details/79128033  -Xmx20m -Xms5m -XX:HeapDumpOnOutofMemoryError -XX:HeapDumpPath=d:/a.dump分配了20M最大空间 ,启动 最小空间5M , 发生了 内存溢出错误 dump路径为a.dump Heap Dump 概述 Heap Dump 是 Java进程所使用的内存情况在某一时间的一次快照.以文件的形式持久化到磁盘中. H

GCC全过程详解+剖析生成的.o文件[转]

使用GCC编译一个.c文件影藏了哪些过程? GCC四步详解第一步:预处理(也叫预编译)        gcc -E  hello.c  -o hello.i        或者 cpp hello.c > hello.i     [cpp是预编译器]        将所有#define删除,并且展开所有的宏定义        处理所有的条件预编译指令,如#if #ifdef  #undef  #ifndef  #endif #elif        处理#include,将包含的文件插入到此处,

Android gen根目录下自动生成的R文件指向问题

今天才弄明白,原来在调用vitamio包的时候使用它们的R文件,然后在迁入广告的时候出现了问题,但是瞎胡搞半天后把问题解决了,可没有明白这是什么原因. 今天更新应用又出现了相同的情况,无意中打开了gen的根目录妈蛋!发现里面的报名根本就不是我现在应用的包名.而是调用的那个工程的包名!这下终于找到根本原因了,但是怎么解决呢???----------->修改包名呗~~~~~~~可是你改了它又会自动生成了原来的那个,--------------后来终于发现原来这个R文件的包名适合manifest文件中