4

我的应用程序有一个崩溃转储。我的应用程序失败,因为某些用户说“无效指令”试图执行我在那里的一些 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) 打印“未找到导出”。

4

2 回答 2

5

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

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

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

处理器系列将一个或多个处理器标识为属于具有某些用于软件或硬件目的的通用定义的组。模型指定处理器系列的一个实例。步进标识特定模型的特定版本。 因此,Family、Model 和 Stepping 组合在一起形成了处理器的唯一标识或签名。

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

我们可以通过查看模型进一步缩小范围。围绕巴塞罗那核心有许多不同的型号,品牌不同,分别为 Athlon II、Opteron、Phenom、Phenom II、Sempron、Turion 和 V 系列。你的是模型 4。这有点棘手,因为我不知道有一个很好的资源可以列出各种 CPU 的型号和步进。您必须直接去找制造商并浏览他们的手册。例如,这里是 AMD 的 10h 系列修订指南. 如果您转到“处理器标识”部分(对我来说,它在 PDF 中显示为书签),您会看到一些看起来很有希望的东西,但这些信息肯定不是以易于理解的形式呈现的。您会得到长的十六进制值,您必须从中提取对应于系列 (8-11)、模型 (4-7) 和步进 (0-3) 的各个位。

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

无论如何,您可能已经停止了一段时间,因为微架构会告诉您您需要知道的一切。这是一个 AMD Barcelona 核心,它不支持补充 SSE3 (SSSE3)指令(三个S——不要与 SSE3 混淆;命名约定很荒谬)。SSSE3 由 Intel 发明,与 Core 2 微架构一起发布。

AMD 直到 Bobcat/Bulldozer 才实施它们。Bulldozer是用于台式机和服务器的下一代系列 21 (15h),而Bobcat是 AMD 的 APU 的低孔内核。

SSSE3 并没有真正提供那么多新指令。只有 16 个,主要用于处理压缩整数,其中大多数都不是很令人兴奋。转储还应该告诉您导致崩溃的指令的操作码。如果没有,您将不得不返回并从代码的字节地址中找出它。这将准确地告诉您哪条指令是问题所在。我猜您正在使用PSHUFB 就地混洗字节,这是一条实际上非常有用的 SSSE3 指令。我见过的一个常见用途是快速人口计数算法(尽管还有其他不需要 SSSE3 的实现几乎同样快,如果不是更快的话)。

假设您正在使用 MSVC 进行编译,看到它发出这条指令,我实际上有点惊讶。为了得到它,你必须告诉编译器以 AVX 为目标,这将阻止你的代码在比 Sandy Bridge/Bulldozer 更旧的任何东西上运行。我敢肯定,如果您不想提高最低系统要求,您可以找出另一种指令序列来做同样的事情。pshufd, 或movaps+shufps是解决方法的可能候选者。

于 2016-06-22T17:43:51.270 回答
4

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

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

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

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

于 2016-06-22T19:34:59.733 回答