在给定用户模式故障转储

时间:2016-06-22 16:39:22

标签: 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

google所说的其他命令可能有帮助(!errrec,!cpuinfo,!sysinfo)print“No export found”。

2 个答案:

答案 0 :(得分:5)

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

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

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

  

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

如果您在寻找这些东西时拥有制造商是最有帮助的,因为家庭数字相当混乱,但幸运的是,很明显家庭号码16(十六进制10)对应于AMD处理器(应该有制造商字符串&#34; AuthenticAMD&#34;)。具体来说,它是AMD K10,这是巴塞罗那的微体系结构。这意味着没有超线程 - 这只是一个原生的四核系统。

我们可以通过查看模型进一步缩小范围。巴塞罗那核心有许多不同的型号,分别为Athlon II,Opteron,Phenom,Phenom II,Sempron,Turion和V系列。你的是模型4.这是一个棘手的地方,因为我不知道一个好的资源,列出了各种CPU的型号和步进。您必须直接与制造商联系并浏览他们的手册。例如,here is AMD's Revision Guide for the 10h Family。如果你去了处理器识别&#34;部分(在PDF中显示为PDF中的书签),您会看到看起来很有前景的内容,但信息肯定不会以易于理解的形式呈现。您将获得长十六进制值,您必须从中提取对应于族(8-11),模型(4-7)和步进(0-3)的单个位。

我没有完成所有咕噜咕噜的工作,我只是快速猜测这是AMD Phenom II X4。 X4适合四核,从粗略的一瞥看,Phenom IIs似乎是模型4。

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

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

SSSE3并没有真正提供许多新指令。只有16,主要用于处理打包的整数,其中大多数aren't very exciting。转储还告诉您导致崩溃的指令的操作码。如果没有,您将不得不返回并从代码的字节地址中找出它。这将告诉您究竟哪个指令是问题。我猜你正在使用PSHUFB来就地填充字节,这是一条实际上非常有用的SSSE3指令。我见过的一个常见用途是a fast population count algorithm(尽管还有其他一些不需要SSSE3的实现,几乎同样快,如果不是更快)。

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

答案 1 :(得分:4)

命令!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所显示的完全相同,因此转储中确实没有更多信息。