2

一个客户正在运行我公司的程序,它在到达任何地方之前就停止了。他们从 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 吗?我很难看清实际拆解了多少,因为滚动条不能完全工作。(我无法抓取和移动滚动位置;我必须逐行或逐页滚动。)

感谢您提供的任何见解!

4

3 回答 3

2

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

Visual Studio 对整个过程空间进行了拆解。???表示该位置不可访问。

您最好需要一个堆栈框架来从核心转储中查看正在发生的事情。

于 2009-01-29T21:36:51.510 回答
2

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

于 2009-01-29T21:40:16.090 回答
1

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

正如 Fredrik 所说,WinDbg 也可以提供帮助,特别是如果您可以从客户的 PC 中获取故障转储。

于 2009-01-29T21:54:01.087 回答