【发布时间】:2010-11-22 02:21:41
【问题描述】:
我为个人使用(用 C++ 编写)制作的一个小实用程序昨天随机崩溃(到目前为止,我已经使用了大约 100 多个小时,没有任何问题),虽然我通常不这样做,但我是感觉有点冒险,想尝试更多地了解这个问题。我决定进入事件查看器并查看 Windows 记录的有关崩溃的内容:
Faulting application StraightToM.exe, version 0.0.0.0, time stamp 0x4a873d19
Faulting module name : StraightToM.exe, version 0.0.0.0, time stamp 0x4a873d19
Exception code : 0xc0000005
Fault offset : 0x0002d160,
Faulting process id: 0x17b4
Faulting application start time: time 0x01ca238d9e6b48b9.
我的问题是,这些东西是什么意思,我将如何使用它们来调试我的程序?这是我目前所知道的:异常代码描述了错误,0xc0000005 是内存访问冲突(试图访问它不拥有的内存)。我特别有兴趣了解以下内容:
- 故障偏移是什么意思?这是否表示文件中发生错误的位置,还是表示发生错误的装配“行”?知道了故障偏移量,我将如何使用像 OllyDbg 这样的程序来找到导致错误的相应汇编代码?或者——甚至更好——是否可以(轻松)确定 C++ 源代码中的哪一行代码导致了这个错误?
- 很明显时间戳对应崩溃时的32位UNIX时间,但是64位应用程序启动时间是什么意思呢?如果时间戳是 32,为什么会是 64 位?
请注意,我主要是一名 C++ 程序员,所以虽然我对汇编有所了解,但我对它的了解非常有限。此外,这确实不是一个需要修复的严重问题(并且鉴于程序的性质,也不容易重现),我只是更多地以此为借口来了解更多关于这些错误消息的含义。我在网上找到的有关这些崩溃日志的大部分信息通常都是针对最终用户的,因此它们对我(作为程序员)的帮助不大。
提前致谢
【问题讨论】:
-
0xc0000005 - 访问被拒绝...
-
对于未来的读者,
0xc0000005不是拒绝访问,而是“发生访问冲突”。正确的代码,错误的设施。 Access denied 是 Windows 工具下的代码 5,0x80070005也是如此,通常缩写为0x00000005。
标签: c++ windows debugging assembly crash