1

我尝试使用windbg分析故障转储文件,并键入扩展命令以获取一些基本分析结果“!分析-v”,得到的结果如下:-(我在这里只粘贴了部分信息)

....
  ExceptionCode: c0000005 (Access violation)
  ExceptionFlags: 00000000
NumberParameters: 2
   Parameter[0]: 00000000
   Parameter[1]: 00000004
Attempt to read from address 00000004

PROCESS_NAME:  tscommand.exe

...

LAST_CONTROL_TRANSFER:  from 010444c2 to 010181e6

FAULTING_THREAD:  00002270

BUGCHECK_STR:  APPLICATION_FAULT_NULL_CLASS_PTR_READ_AFTER_CALL

PRIMARY_PROBLEM_CLASS:  NULL_CLASS_PTR_READ_AFTER_CALL

DEFAULT_BUCKET_ID:  NULL_CLASS_PTR_READ_AFTER_CALL

STACK_TEXT:  

...

“BUGCHECK_STR:APPLICATION_FAULT_NULL_CLASS_PTR_READ_AFTER_CALL”在这里是什么意思?这是否意味着应用程序在调用函数后由于 NULL 类指针而出错?我在网上搜索,找不到任何关于 APPLICATION_FAULT_NULL_CLASS_PTR_READ_AFTER_CALL 的信息。

4

1 回答 1

2

“BUGCHECK_STR”是微软用来“分类”错误的一种分类,这个分类似乎表明你有一个 NULL 类指针 - 这对我来说似乎是正确的,因为内存读取来自地址 4,这是一个离 NULL 指针基数的小偏移量。

基本上,您遇到的情况是您正在使用指向某物的指针(我不是 100% 确定它是这样的类),并且当您取消引用它时指针为 NULL。这完全有可能是由对成员函数的调用引起的,调试器可以[通过查看调用堆栈、符号和寄存器值的组合]来解决这个问题,但 WinDBG 获得这些东西并不是未知的有时会出错——这是启发式的,所以它类似于“如果我们这里有这个值,那里有那个值,还有其他东西与这个范围相匹配,那么就是这组错误”。

如果您在崩溃时发布了更多的堆栈/寄存器值,则可能会更多地找出问题所在。

从错误代码和带有错误的额外数据的组合可以确定的是,您的代码正在读取内存中的地址 4。这通常意味着尝试在“NULL”指向的类/结构中使用第二个整数或浮点数。当我在我的代码中忘记了“if (ptr != NULL) ...”时,我已经看到了很多次。不时发生在我们大多数人身上...

于 2013-02-20T12:39:23.067 回答