代码之家  ›  专栏  ›  技术社区  ›  Owen

VS反汇编窗口是否显示整个EXE?

  •  2
  • Owen  · 技术社区  · 17 年前

    一个客户正在运行我公司的程序,但在它到达任何地方之前就停止了。他们从Windows事件日志中发送了此信息:

    faulting module program.exe, version 1.2.3.4, fault address 0x00054321.
    

    我们没有太多其他事情要做,所以作为最后的努力,我一直在努力看看我是否能找到拆卸器中的位置。我通过Visual Studio运行程序,暂停它,查看“反汇编”窗口并尝试滚动到该地址,但我得到的只有以下内容:

    00054321  ???              
    00054322  ???              
    00054323  ???              
    00054324  ???              
    00054325  ???              
    00054326  ???              
    00054327  ???              
    00054328  ???              
    00054329  ???              
    0005432A  ???              
    

    这是因为Visual Studio只反汇编EXE中靠近暂停位置的部分吗?由于滚动条不能完全工作,我很难查看实际拆卸了多少。(我无法抓取和移动滚动位置;我必须按行或按页滚动。)

    感谢您提供的任何见解!

    3 回复  |  直到 17 年前
        1
  •  2
  •   QbProg    17 年前

    故障地址也可能是由堆栈损坏问题引起的,即返回地址可能被泄露并跳回错误的地址@0x54321。 此外,根据所使用的技术(Java、.NET),代码可能会在运行之间更改其位置。

    Visual studio对整个过程空间进行了分解。 ????意味着该位置不可访问。

    你最好需要一个堆栈框架,从核心转储中查看发生了什么。

        2
  •  2
  •   Fredrik Jansson    17 年前

    Winchester可能是你的朋友,在那里你可以加载你的可执行文件和符号(.pdb),如果你能像QbProg所说的那样得到一个(迷你)转储,这肯定会简化搜索。但我有过这样的经历,在Winger中更容易做到这一点。

        3
  •  1
  •   Stu Mackellar    17 年前

    您希望在拆卸窗口中看到什么?这种方法行不通。如果您能够重建与您的客户端正在运行的完全相同的构建配置,那么您可以启用 /MAP 项目链接选项中的选项。这将创建一个将符号映射到地址的文件,并允许您查看崩溃发生时正在执行的函数。您可能需要进行一些计算,以将原始映射地址与客户端PC上加载模块的地址进行偏移。

    正如Fredrik所说,Winchester可能也能提供帮助,特别是如果你能从客户端的PC上获取崩溃转储。