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

时间:2009-01-29 21:31:37

标签: visual-studio disassembly

客户正在运行我公司的程序,它在任何地方停止运行。他们从Windows事件日志中发送了这些信息:

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

我们没有太多其他事情可以继续,所以作为最后的努力,我一直试图看看我是否能找到这个位置在反汇编器中的位置。我通过Visual Studio运行该程序,暂停它,查看Disassembly窗口并尝试滚动到该地址,但我得到的就是:

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

这是因为Visual Studio只会在暂停位置附近拆分部分EXE吗?由于滚动条无法完全运行,因此我很难查看实际拆解的数量。 (我无法抓住并移动滚动位置;我必须逐行或按页面滚动。)

感谢您的任何见解!

3 个答案:

答案 0 :(得分:2)

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

Visual Studio对整个过程空间进行反汇编。 ????意味着该职位无法获得。

你最好需要一个堆栈框架来查看核心转储中发生的情况。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

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