我正在使用VS2008来调试GPF(ACCESS VIOLATION)。 Iset EIP到崩溃地址,它适当地弹出我的一些源代码。它似乎不是GPF的原因。
我在一台8核机器上。这些东西上有多个CS:EIP寄存器吗?如果是这样,我如何在Visual Studio中访问它们?
非常感谢!
答案 0 :(得分:1)
一般保护错误(GPF)可能由任何类型的无效内存访问引起。不仅尝试对无效存储器地址执行指令,而且还尝试访问指令使用的无效存储器地址上的操作数。例如,
mov [eax], ebx
如果存储在eax中的值为NULL(经典空指针解除引用),将导致GPF。如果Visual Studio调试器指向某个部分指令地址(CS:EIP)并且您可以在该地址上找到代码,则故障的原因将是该指令使用的内存操作数的地址。默认情况下,Visual Studio将在错误线程的上下文中提供信息。所以,没有任何理由去研究另一个线程上下文。
例如:
如果我们打开Debug-> Windows->反汇编,我们会看到下一张图片:
如您所见,GPF因存储在eax中的无效地址而上升。第一张图片的消息框中指示的故障指令地址0x012b1002与第二张图片上的调试器指向的相同。第一张图中的故障地址0x00000000是存储在eax中的地址,用作mov指令中的存储器参数。
答案 1 :(得分:0)
目前,每个核心都有两套完整的寄存器,包括CS:EIP,即使在64位时代,CS并不重要。两个因为超线程(两个虚拟核心在一个物理核心中,或多或少)。但是每组寄存器都是独立的,你不会受到来自不同进程的干扰(除非你的操作系统非常糟糕)。
至于你的问题。 GPF很棘手,它可能不像调试器所说的问题那样SEEM,但通常很好地接受它的话。您的程序中可能存在内存问题,指针错误,溢出,悬空指针,未初始化的变量或某些此类问题。如果您使用Linux我会说尝试valgrind。如果您的应用程序是多线程的,那么所有这些都会更糟。
您的问题中没有足够的信息,但我建议您卷起袖子进行调试。例如。添加一堆断言或记录变量。