zoukankan      html  css  js  c++  java
  • 在x64计算机上捕获32位进程的内存转储

    这是一个我经常遇到的问题,我们经常会遇到这样的情况:我们必须重新捕获内存转储,因为内存转储是以“错误”的方式捕获的。
    简而言之:如果在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: WindowsSysWOW64 askmgr.exe中的32位任务管理器来获取32位转储。如果要验证是否正在运行32位版本的任务管理器,可以检查任务管理器本身中是否列出了taskmgr.exe和*32。当然还有其他工具。

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

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

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

  • 相关阅读:
    iOS工作笔记(十二)
    隐藏底部导航栏tabbar
    SDWebImage的使用及图片不改变问题的解决
    NSString转化为NSDictionary
    makeObjectsPerformSelector用法
    iOS中点与像素
    iOS动画的简单介绍
    Pods安装时卡在Updating local specs repositories界面时的处理
    使用uicollectionView时需要注意的问题
    Sublime Text 3 自定义配置快捷键
  • 原文地址:https://www.cnblogs.com/yilang/p/11949780.html
Copyright © 2011-2022 走看看