我尝试使用windbg分析崩溃转储文件,并输入扩展命令以获得一些基本的分析结果“!analyze -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的任何信息。
答案 0 :(得分:2)
“BUGCHECK_STR”是Microsoft用来“分类”错误的分类,这个似乎表明你有一个NULL类指针 - 这似乎对我来说是正确的,因为内存读取来自地址4,这是一个远离NULL指针基址的小偏移。
基本上,你遇到的情况是使用指向某事物的指针(我不是100%确定它是一个类),并且当你取消引用它时指针是NULL。完全有可能这是由对成员函数的调用引起的,并且调试器可以[通过查看调用堆栈,符号和寄存器值的组合]来解决这个问题,但是WinDBG获取这些东西并不是未知的。不时出错 - 这是启发式的,所以它就像“如果我们在这里有这个值,那个值和其他东西匹配这个范围,那就是这组错误”。
如果您在崩溃时发布了更多的堆栈/寄存器值,那么可能会更多地了解出现了什么问题。
错误代码和额外数据与错误的组合可以肯定的是,您的代码正在读取内存中的地址4。这通常意味着尝试在“NULL”指向的类/结构中使用第二个整数或浮点数。当我在代码中忘记了“if(ptr!= NULL)...”时,我已经看过几次。不时发生在我们大多数人身上......