这是一个我经常遇到的问题,我们经常会遇到这样的情况:我们必须重新捕获内存转储,因为内存转储是以“错误”的方式捕获的。
简而言之:如果在64位计算机上执行32位进程,则需要使用允许创建32位转储的工具捕获转储。

怎么知道进程是32位的?

如果您在64位计算机上,可以检查任务管理器以查看您的进程正在使用的体系结构。

带*32的进程是32位的,其余的是64位的,因此在上面的示例中,我们可以看到QQ.exe正在执行32位代码。

为什么用正确的工具捕捉它们很重要?

如果使用捕获64位转储的工具捕获转储,您仍将获得内存转储,但您将获得syswow64的内存转储,这意味着许多扩展(如sos和psscor2)将无法读取数据。有些事情可能仍然有效,但它是非常有限的,你可能会得到错误或错误的调用堆栈等。
当您试图读取32位进程的64位内存转储时,通常会发生以下情况:

1、你可能会看到这样的警告

WARNING: wkscli overlaps srvcli
..............WARNING: wship6 overlaps dnsapi
.WARNING: IPHLPAPI overlaps dsrole
...WARNING: FWPUCLNT overlaps rasadhlp
WARNING: FWPUCLNT overlaps dnsapi
.....WARNING: compstat overlaps iisre

2、堆栈显示wow64cpu方法

0:000> kp
Child-SP          RetAddr           Call Site
00000000`000ce728 00000000`73a22bcd wow64cpu!CpupSyscallStub+0x9
00000000`000ce730 00000000`73a9d07e wow64cpu!Thunk0ArgReloadState+0x1a
00000000`000ce7f0 00000000`73a9c549 wow64!RunCpuSimulation+0xa
00000000`000ce840 00000000`76d684c8 wow64!Wow64LdrpInitialize+0x429
00000000`000ced90 00000000`76d67623 ntdll!LdrpInitializeProcess+0x17e2
00000000`000cf290 00000000`76d5308e ntdll! ?? ::FNODOBFM::`string'+0x2bea0
00000000`000cf300 00000000`00000000 ntdll!LdrInitializeThunk+0xe

3、所有地址都是64位地址,即使这是一个32位的进程。

4、在尝试运行sos命令时会出现如下错误。
注意:如果没有正确设置符号,也会出现这些错误,因此这不是出现这些错误的唯一原因。

0:000> !eeheap -gc
Failed to load data access DLL, 0x80004005
Verify that 1) you have a recent build of the debugger (6.2.14 or newer)            
2) the file mscordacwks.dll that matches your version of clr.dll is                
in the version directory            
3) or, if you are debugging a dump file, verify that the file                
mscordacwks_<arch>_<arch>_<version>.dll is on your symbol path.            
4) you are debugging on the same architecture as the dump file.                
For example, an IA64 dump file must be debugged on an IA64                 machine.

应该使用什么工具?

在此场景中捕获进程转储的最佳方法是使用32位版本的工具,如Debug Diag或adplus+cdb(用于windows的32位调试工具)。您可以在64位系统上安装这些工具的32位版本。在下一个版本的Debug Diag中,您将能够使用64位版本的Debug Diag捕获32位转储。
我之前提到过,可以使用Vista+上的任务管理器捕获内存转储,但如果在64位计算机上执行此操作,则会获得64位转储。但是,您可以使用位于C:\ Windows\SysWOW64\taskmgr.exe中的32位任务管理器来获取32位转储。如果要验证是否正在运行32位版本的任务管理器,可以检查任务管理器本身中是否列出了taskmgr.exe和*32。当然还有其他工具。

使用正确的“位”调试器加载转储文件是否重要?

是的,要读取32位转储,您应该使用32位windbg(在32位或64位操作系统上),而对于64位转储,您调试转储的计算机需要是运行64位windbg的64位计算机。

记住,如果要调试64位转储,还应该使用sos、psscor2、sosex的64位版本和可能使用的任何其他扩展。

在x64计算机上捕获32位进程的内存转储的更多相关文章

  1. Windows是如何将64位Ntdll映射到32位进程的---转自简书

    今天我们探索一个问题: 64位的ntdll是如何被加载到WoW64下的32位进程?今天的旅程将会带领我们进入到Windows内核逻辑中的未知领域,我们将会发现32位进程的内存地址空间是如何被初始化的. ...

  2. CLR调试报错“Visual Studio远程调试监视器 (MSVSMON.EXE) 的 64 位版本无法调试 32 位进程或 32 位转储。请改用 32 位版本”的解决

    Win7 64位电脑上进行visual studio的数据库项目的CLR存储过程进行调试时,报错: ---------------------------Microsoft Visual Studio ...

  3. Wow64(32位进程)注入DLL到64位进程

    转载自: https://blog.poxiao.me/p/wow64-process-inject-dll-into-x64-process/ 向其他进程注入DLL通常的做法是通过调用CreateR ...

  4. WinDbg 在64位系统下转储32位进程

    在64位系统下,首先要判断进程是32位,还是64位 在Win8之前,进程名后带星号(*)则是32位进程.但Win8.1后,则不显示星号.需要选出“平台”列,来确认32位,还是64位. 在64位系统下的 ...

  5. 64位系统上32位进程拷贝文件到System32目录时的重定向

    64位系统上,32位进程拷贝文件到"System32"目录时,会被文件系统重定向到"SysWOW64"目录 要禁用这种重定向,需要用到下面2个API: Wow6 ...

  6. 如何在Win7 x64上的配置32位的PostgreSQL ODBC数据源

    在Win7 x64下安装最新版的PostgreSQL 9.x 后,从其官网下载最新的 ODBC驱动,分为普通的32位和64位版本,正常安装后,从已安装软件列表里可以看到两个版本的驱动都已经正确显示出来 ...

  7. X64下IIS调用32位的dll

    WebAPI项目中遇到了需要调用32位C++的dll的情况,调试的时候能正常调用,但是发布了之后部署在IIS中出现了BadFormatImage异常, 解决方法是在IIS中相应应用程序池=>高级 ...

  8. wow64 32位进程中切换64位模式,取回64位寄存器值

    32位dbg中编辑的: 7711E9D3 | 6A | | 7711E9D5 | E8 | 7711E9DA | | | 7711E9DE | CB | ret far | 6A E8 CB 64位d ...

  9. C# 编译器选项 /platform(指定输出平台)32位程序运行到x64平台的问题

    如果说你编译的exe运行时报错: “尝试读取或写入受保护的内存.这通常指示其他内存已损坏” 这很有可能是你是以非托管的方式错误地引用了64位的API中去. 为什么会这样? 那你就要考虑VS的编译器选项 ...

随机推荐

  1. 关于nslookup以及dig命令的研究报告

    我们在日常上网时都是用域名访问网路,如www.baidu.com,而在实际寻址过程中,是使用IP地址,如180.101.49.11,域名到IP地址的解析是通过DNS服务器来实现的,系统中我们可以用一些 ...

  2. RabbitMq 概述

    RabbitMQ是实现了高级消息队列协议(Advanced Message Queueing Protocol , AMQP)的开源消息代理软件(亦称面向消息的中间件). 1.AMQP协议 Rocke ...

  3. 2.NET Core设定数据库种子

    1.使用以下代码在 Models 文件夹中创建一个名为 SeedData 的新类: using Microsoft.EntityFrameworkCore;using Microsoft.Extens ...

  4. C# vb .net图像合成-合成富文本

    在.net中,如何简单快捷地实现图像合成呢,比如合成文字,合成艺术字,多张图片叠加合成等等?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码 ...

  5. C# vb .net图像合成-合成艺术字 照片合成艺术字

    在.net中,如何简单快捷地实现图像合成呢,比如合成文字,合成艺术字,多张图片叠加合成等等?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码 ...

  6. Tornado + Bootstrap 快速搭建自己的web应用

    前言 最近用 python tordado 框架, 整了一个模板页面, 用于接入与发布数据的展示, tornado 简单易用, bootstrap 比较流行, 用起来也省事, 配合起来做些小案例非常迅 ...

  7. Github下载慢和下载过程中断等情况的解决方案

    Github下载慢和下载过程中断等情况的解决方案   最近老大push项目,正常的git clone每次都是下载一部分就断掉了. 尝试了修改hosts文件的方式,更换了延迟最低的域名也没啥用(难道我姿 ...

  8. 【开发笔记】- 安装Git命令

    1.查看linux版本信息: $ cat /etc/redhat-release 2.输入命令安装git: $ yum install git 3.等待下载,自动安装完毕,查看git版本 $ git ...

  9. vue请求简单配置

    简单记录一下vue的http请求配置相关 测试环境请求接口设置: 1.  config/dev.env.js添加: module.exports = merge(prodEnv, { NODE_ENV ...

  10. Android-----Intent通过startActivityForResult(Intent intent , int 标志符)启动新的Activity

    我们都了解使用 startActivity(intent) 新的activity只能传递数据,却无法返回数据,返回新activity返回的数据我们可以替换startActivityForResult( ...