跟踪哪个依赖项包含 SSE 指令

Tracking down which dependency contains SSE instructions

本文关键字:包含 SSE 指令 依赖 跟踪      更新时间:2023-10-16

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

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

我们正在使用 VS 并且语言C++,因此适用于该工具集的任何工具都很棒。

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

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

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

编辑:另一种反汇编.lib文件的方法是使用Visual Studio附带的DUMPBIN实用程序。此外,STATUS_ACCESS_DENIED建议的小型转储方法是一个很好的主意。

使用此处所述的方法从客户处获取小型转储文件。 即让客户运行您的构建。一旦它崩溃,应该创建一个小型转储文件,你可以使用它 - 事后分析 - 来准确分析它崩溃的位置。它与调试符号(和/或映射文件)一起,实际上会告诉您造成严重破坏的确切库。

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