多核处理器上有多少个CS:EIP寄存器?

时间:2012-10-26 15:34:38

标签: cpu

我正在使用VS2008来调试GPF(ACCESS VIOLATION)。 Iset EIP到崩溃地址,它适当地弹出我的一些源代码。它似乎不是GPF的原因。

我在一台8核机器上。这些东西上有多个CS:EIP寄存器吗?如果是这样,我如何在Visual Studio中访问它们?

非常感谢!

2 个答案:

答案 0 :(得分:1)

一般保护错误(GPF)可能由任何类型的无效内存访问引起。不仅尝试对无效存储器地址执行指令,而且还尝试访问指令使用的无效存储器地址上的操作数。例如,

mov [eax], ebx
如果存储在eax中的值为NULL(经典空指针解除引用),

将导致GPF。如果Visual Studio调试器指向某个部分指令地址(CS:EIP)并且您可以在该地址上找到代码,则故障的原因将是该指令使用的内存操作数的地址。默认情况下,Visual Studio将在错误线程的上下文中提供信息。所以,没有任何理由去研究另一个线程上下文。

例如: enter image description here

如果我们打开Debug-> Windows->反汇编,我们会看到下一张图片: enter image description here

如您所见,GPF因存储在eax中的无效地址而上升。第一张图片的消息框中指示的故障指令地址0x012b1002与第二张图片上的调试器指向的相同。第一张图中的故障地址0x00000000是存储在eax中的地址,用作mov指令中的存储器参数。

答案 1 :(得分:0)

目前,每个核心都有两套完整的寄存器,包括CS:EIP,即使在64位时代,CS并不重要。两个因为超线程(两个虚拟核心在一个物理核心中,或多或少)。但是每组寄存器都是独立的,你不会受到来自不同进程的干扰(除非你的操作系统非常糟糕)。

至于你的问题。 GPF很棘手,它可能不像调试器所说的问题那样SEEM,但通常很好地接受它的话。您的程序中可能存在内存问题,指针错误,溢出,悬空指针,未初始化的变量或某些此类问题。如果您使用Linux我会说尝试valgrind。如果您的应用程序是多线程的,那么所有这些都会更糟。

您的问题中没有足够的信息,但我建议您卷起袖子进行调试。例如。添加一堆断言或记录变量。