C++ 什么是;错误检查“u STR:APPLICATION”u FAULT“u NULL”u CLASS“u PTR”u READ“u CALL”之后;在windbg中的意思!分析-v输出

C++ 什么是;错误检查“u STR:APPLICATION”u FAULT“u NULL”u CLASS“u PTR”u READ“u CALL”之后;在windbg中的意思!分析-v输出,c++,debugging,windbg,crash-dumps,C++,Debugging,Windbg,Crash Dumps,我尝试使用windbg分析崩溃转储文件,并键入extension命令以获得一些基本的分析结果“!analyze-v”,结果如下:-(我只粘贴了部分信息) 这里的“BuggCheck\u STR:APPLICATION\u FAULT\u NULL\u CLASS\u PTR\u READ\u AFTER\u CALL”是什么意思?这是否意味着由于调用函数后出现空类指针而导致应用程序出错?我在网上搜索,在调用后找不到任何关于应用程序的信息 Microsoft使用“BUGCHECK_STR”分类来“

我尝试使用windbg分析崩溃转储文件,并键入extension命令以获得一些基本的分析结果“!analyze-v”,结果如下:-(我只粘贴了部分信息)

这里的“BuggCheck\u STR:APPLICATION\u FAULT\u NULL\u CLASS\u PTR\u READ\u AFTER\u CALL”是什么意思?这是否意味着由于调用函数后出现空类指针而导致应用程序出错?我在网上搜索,在调用后找不到任何关于应用程序的信息

Microsoft使用“BUGCHECK_STR”分类来“分类”错误,这一分类似乎表明您有一个空类指针-这对我来说似乎是正确的,因为内存是从地址4读取的,地址4与空指针的基部有一个小偏移量

基本上,您使用的是指向某个对象的指针(我不能100%确定它是一个类本身),并且当您取消引用该指针时,该指针为空。这完全有可能是由对成员函数的调用引起的,调试器可以(通过查看调用堆栈、符号和寄存器值的组合)找出这一点,但WinDBG不时出错并非未知——这是启发式的,所以类似于“如果我们这里有这个值,那里有这个值,还有其他一些值与这个范围匹配,那么就是这组错误”

如果您在崩溃点发布了更多的堆栈/寄存器值,那么可能会发现更多的错误


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

这是一条我从未见过的错误检查消息。这可能意味着您使用空指针调用了一个类函数。0xc0000005是一个访问冲突,地址是0x00000004。查看“这是出错的地方”的反汇编代码,显然是传入的结构或类出错了。+4是正在访问的成员变量的偏移量,您可以在寄存器转储中看到
eax
为零。如果不理解代码,我不知道下一步该建议什么。可能是
ein
中的某些结构出现故障
&rc
只是指向局部变量的指针,对吗?不,在正常系统(Windows、Linux、MacOS、Symbian等)中,局部变量的地址永远不会是4。
....
  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:  

...