在给定用户模式故障转储的情况下找出CPU模型

Soo*_*nts 4 windows windbg system-information

我的应用程序有崩溃转储.我的应用程序失败,一些用户说"无效指令"试图执行我在那里的一些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
Run Code Online (Sandbox Code Playgroud)

谷歌的其他命令说可能有帮助(!errrec,!cpuinfo,!sysinfo)打印"找不到导出".

Cod*_*ray 5

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

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

F/M/S是Family/Model/Stepping,它是识别处理器的常用且相当标准的方法.正如AMD所说:

处理器系列将一个或多个处理器标识为属于具有用于软件或硬件目的的一些通用定义的组.该型号指定处理器家族的一个实例.该 步进标识特定模型的特定版本.因此,系列,型号和步进一起形成处理器的唯一标识或签名.

如果您在寻找这些东西时拥有制造商是最有帮助的,因为家庭编号非常混乱,但幸好很明显,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 IIs似乎是模型4.

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

直到Bobcat/Bulldozer,AMD才实施它们.Bulldozer是台式机和服务器的下一代家族21(15h),而Bobcat是AMD APU的低孔核心.

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

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