客户正在运行我公司的程序,它在任何地方停止运行。他们从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吗?由于滚动条无法完全运行,因此我很难查看实际拆解的数量。 (我无法抓住并移动滚动位置;我必须逐行或按页面滚动。)
感谢您的任何见解!
答案 0 :(得分:2)
故障地址也可能是由堆栈损坏问题引起的,即。返回地址可能会被泄露并跳回到错误的地址@ 0x54321。 此外,根据所使用的技术(Java,.NET),代码可以改变它在运行之间的位置。
Visual Studio对整个过程空间进行反汇编。 ????意味着该职位无法获得。
你最好需要一个堆栈框架来查看核心转储中发生的情况。
答案 1 :(得分:2)
WinDbg可能是你的朋友,在那里你可以加载你的可执行文件和符号(.pdb),如果你可以获得(迷你)转储,因为QbProg说这肯定会减轻搜索速度。但是我有经验,在WinDbg中更容易做到这一点。
答案 2 :(得分:1)
您希望在反汇编窗口中看到什么?这种方法不起作用。如果您能够重建与客户端运行完全相同的构建配置,则可以在项目的链接选项中启用/MAP选项。这将创建一个将符号映射到地址的文件,并允许您查看崩溃发生时正在执行的函数。您可能需要进行一些计算,以将原始映射地址与模块在客户端PC上加载的地址进行偏移。
正如Fredrik所说,WinDbg也可以提供帮助,特别是如果你可以从你客户的PC上获得崩溃转储。