跟踪哪个依赖项包含 SSE 指令
Tracking down which dependency contains SSE instructions
我们的一位客户需要构建我们的程序,而无需SSE,因为他使用的是相当旧的硬件。我的问题是,即使我全面修改我们的项目设置以取消设置所有库和二进制文件的SSE,似乎仍然存在使用SSE指令编译的依赖项,导致应用程序崩溃。
我的问题是:有没有办法获取二进制文件或库并检测它是否包含特定版本的 SSE 的 SSE 指令?
我们正在使用 VS 并且语言C++,因此适用于该工具集的任何工具都很棒。
反汇编所有涉及的二进制文件,然后在反汇编中搜索 SSE 指令助记符。
由于您已经在编译器中关闭了 SSE 指令生成,因此问题出在其中一个静态库中。要缩小范围,基本上您有两种方法:
- 反汇编要链接到的 .lib 或 .obj 文件。除非您碰巧可以使用专用工具,否则这实际上并不是一个简单的解决方案。通常,反汇编是一个非常复杂的过程,因为该工具必须找出代码中的所有执行路径,而无需实际运行它。这样做是为了将数据与代码分开。完成此类任务的最佳工具是 IDA Pro。反汇编后,您可以通过在 IDA Pro 中编写宏或将结果导出到文本文件并使用 grep 来搜索 SSE 指令。
- 一种更简单的方法是运行程序并找出它崩溃的位置。您需要两件事才能继续:找出导致崩溃的指令的地址和"映射文件"以找出它所属的位置。后者很简单:在Visual studio中,您必须设置编译器和链接器调试选项才能生成映射文件。该文件基本上会告诉您可执行文件中所有函数的地址。查找崩溃地址通常很容易,因为Windows会提示您并说类似应用程序错误的说明在"0x635de077"...您可以使用该地址并查看映射文件以查看它属于哪个函数。或者,可以在调试器中运行程序。当程序崩溃时,调试器会显示程序停止的位置。
编辑:另一种反汇编.lib文件的方法是使用Visual Studio附带的DUMPBIN实用程序。此外,STATUS_ACCESS_DENIED建议的小型转储方法是一个很好的主意。
使用此处所述的方法从客户处获取小型转储文件。 即让客户运行您的构建。一旦它崩溃,应该创建一个小型转储文件,你可以使用它 - 事后分析 - 来准确分析它崩溃的位置。它与调试符号(和/或映射文件)一起,实际上会告诉您造成严重破坏的确切库。
它归结为AlefSin建议的解决方案中的第2点。但是,客户不必运行调试器。对于内核模式驱动程序,这通常是获取有关问题的有意义信息的唯一方法。但是,用户模式代码也存在相同的功能。使用它。
相关文章:
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 编译包含字符串的代码时遇到问题
- c++库的公共头文件中应该包含什么
- 将包含C样式数组的对象初始化为成员变量(C++)
- 是否需要删除包含对象的"pair"?
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 如何将包含epoch时间的十六进制字符串转换为time_t
- 使用mongocxx驱动程序时包含头文件问题
- 如何在h文件中包含.o对象文件
- 在混合代码库中将C转换为C++时出现许多包含错误
- VS2017,C++包含目录与附加包含目录,子文件夹包含失败-但为什么
- cmath抛出错误C2062、C2059、C2143和C2447.cmath包含在矢量文件中
- 为什么您需要C++头文件的包含保护
- 无法在UE4中包含BP类到CPP类
- g++ 说函数不存在,即使包含正确的标头
- 在C++代码中包含opencv时,使用ctypes创建.so文件
- Visual C++GC接口如何启用它以及要包含哪个库
- 传递包含SSE/AVX值的类型
- 跟踪哪个依赖项包含 SSE 指令