找出 CPU 给定用户模式故障转储的模型

Find out CPU model given a user-mode crash dump

我有我的应用程序的故障转储。我的应用程序因一些用户说“无效指令”试图执行我在那里的一些 SSSE 指令而失败。

在 WinDBG 中,如何找到 CPU 模型,以便找到它的指令集,并支持该指令集,或者更新应用程序的最低硬件要求?

这是!cpuid的输出:

CP  F/M/S  Manufacturer     MHz
 0 16,4,3  <unavailable>   3000
 1 16,4,3  <unavailable>   3000
 2 16,4,3  <unavailable>   3000
 3 16,4,3  <unavailable>   3000

google 说的其余命令可能会有所帮助(!errrec,!cpuinfo,!sysinfo)打印“未找到导出”。

你在这里肯定没有得到太多信息。虽然转储通常没有 all 原始 CPU 信息,但您至少应该看到制造商字符串。哦,好吧,让我们看看你在这里需要做什么...

CP 列给出了逻辑处理器编号,因此您知道您正在处理具有 4 个逻辑处理器的系统。可以是四核,也可以是带超线程的双核。

F/M/S 是 Family/Model/Stepping,这是一种常见且相当标准的识别处理器的方法。正如 AMD 所说:

The processor Family identifies one or more processors as belonging to a group that possesses some common definition for software or hardware purposes. The Model specifies one instance of a processor family. The Stepping identifies a particular version of a specific model. Therefore, Family, Model and Stepping, when taken together, form a unique identification or signature for a processor.

如果您在寻找这些东西时有制造商,那将是最有帮助的,因为系列编号非常混乱,但幸运的是,系列编号 16(十六进制的 10)对应于 AMD 处理器非常清楚(制造商字符串应为 "AuthenticAMD")。具体来说,就是AMD K10,也就是Barcelona微架构。这意味着没有超线程——这只是一个原生的四核系统。

我们可以通过查看模型进一步缩小范围。有许多基于 Barcelona 核心的不同型号,品牌各异,如 Athlon II、Opteron、Phenom、Phenom II、Sempron、Turion 和 V 系列。你的是型号 4。这是有点棘手的地方,因为我不知道有什么好的资源可以列出各种 CPU 的型号和步进。您必须直接去找制造商并仔细阅读他们的手册。例如,here is AMD's Revision Guide for the 10h Family。如果您转到 "Processor Identification" 部分(对我来说在 PDF 中显示为书签),您会看到一些看起来很有前途的内容,但这些信息肯定不是以易于理解的形式呈现的。您会得到很长的十六进制值,您必须从中提取与系列 (8-11)、型号 (4-7) 和步进 (0-3) 对应的各个位。

我没有做所有繁重的工作来确定,我只是快速猜测这是 AMD Phenom II X4。 X4适合四核,粗略一看,Phenom II好像是model 4

无论如何,您可能早就停下来了,因为微体系结构会告诉您您需要知道的一切。这是一个 AMD Barcelona 内核,不支持 Supplemental SSE3 (SSSE3) 指令(three S——不要与 SSE3 混淆;命名约定很荒谬)。 SSSE3 由 Intel 发明,与 Core 2 微架构一起发布。

AMD 直到 Bobcat/Bulldozer 才实施它们。 Bulldozer was the subsequent generation, family 21 (15h), for desktops and servers, while Bobcat 是 AMD APU 的低孔隙内核。

SSSE3 并没有真正提供那么多新指令。只有 16 个,主要用于处理压缩整数,其中大部分 aren't very exciting. The dump should also tell you the opcode of the instruction that caused the crash. If not, you'll have to go back and figure it out from the code's byte address. This will tell you exactly which instruction is the problem. I'm guessing that you are using PSHUFB to shuffle bytes in-place, which is the one SSSE3 instruction that is actually pretty useful. One common use I've seen is a fast population count algorithm(尽管还有其他不需要 SSSE3 的实现几乎同样快,如果不是更快的话)。

假设您正在使用 MSVC 进行编译,看到它发出这条指令我真的有点惊讶。为了得到它,你必须告诉编译器以 AVX 为目标,这将阻止你的代码从 运行 到比 Sandy Bridge/Bulldozer 更早的任何东西。我敢肯定,如果您不想提高最低系统要求,您可以想出一个替代指令序列来做同样的事情。 pshufdmovaps + shufps 是可能的变通方法。

命令!sysinfo!cpuinfo!errec是内核转储命令,定义在kdexts扩展中,因此它们不可用在用户模式调试中,如果您显式加载该扩展,可能无法正常工作。

从我的转储中获取更多信息的唯一想法是 .dumpdebug,它将输出一个名为 SystemInfoStream 的流,如下所示:

Stream 7: type SystemInfoStream (7), size 00000038, RVA 000000BC
  ProcessorArchitecture   0000 (PROCESSOR_ARCHITECTURE_INTEL)
  ProcessorLevel          0006
  ProcessorRevision       2A07
  NumberOfProcessors      04
  ... (OS specifics) ...

不幸的是,这与 !cpuid 显示的完全相同,因此转储中确实没有包含更多信息。