追踪哪个依赖包含SSE指令

时间:2011-05-16 11:57:41

标签: c++ visual-c++ sse

我们的一个客户需要在没有SSE的情况下构建我们的程序,因为他在相当旧的硬件上。我的问题是,即使我全面修改我们的项目设置,也要取消所有库的SSE设置。二进制文件似乎仍然存在一个依赖SSE指令编译的依赖,导致应用程序崩溃。

我的问题是:有没有办法获取二进制文件或库并检测它是否包含特定版本SSE的SSE指令?

我们使用VS而且语言是C ++,因此适用于该工具集的任何工具都会非常棒。

3 个答案:

答案 0 :(得分:4)

反汇编所有相关的二进制文件,然后在反汇编中搜索SSE指令助记符。

答案 1 :(得分:1)

由于您已经在编译器中关闭了SSE指令生成,因此问题出在其中一个静态库中。要缩小范围,基本上你有两种方法:

  1. 反汇编您要链接的.lib或.obj文件。除非您碰巧可以访问专用工具,否则它实际上并不是一个简单的解决方案。通常,反汇编是一个非常复杂的过程,因为工具必须弄清楚代码中的所有执行路径而不实际运行它。它用于将数据与代码分开。这类任务的最佳工具是IDA Pro。反汇编后,您可以通过在IDA Pro中编写宏或将结果导出到文本文件并使用grep来搜索SSE指令。
  2. 更简单的方法是运行程序并找出崩溃的位置。您需要继续两件事:查找导致崩溃的指令的地址,并找到“映射文件”以找出它所属的位置。后者很简单:在Visual Studio中,您必须设置编译器和链接器调试选项以生成映射文件。该文件基本上会告诉您可执行文件中所有函数的地址。查找崩溃地址通常很容易,因为Windows会提示您并说出类似应用程序错误的说明 在“0x635de077”... 。您使用该地址并查看映射文件以查看它属于哪个函数。或者,您可以在调试器中运行该程序。当程序崩溃时,调试器会显示程序停止的位置。
  3. 编辑:获取.lib文件反汇编的另一种方法是使用Visual Studio附带的DUMPBIN实用程序。此外,STATUS_ACCESS_DENIED建议的minidump方法是一个很好的主意。

答案 2 :(得分:0)

使用描述为here的方法,以便从客户处获取minidump文件。即让客户运行您的构建。一旦崩溃,就应该创建一个minidump文件,你可以使用它 - 验尸 - 来准确分析崩溃的位置。其中,与调试符号(和/或映射文件)一起,实际上会告诉您造成严重破坏的确切库。

它归结为AlefSin建议的解决方案中的第2点。但是,客户不必运行调试器。对于内核模式驱动程序,这通常是获取有关问题的有意义信息的唯一方法。但是,用户模式代码存在相同的功能。使用它。