非法指令调试

4
我已经编译了一整套生物信息学分析工具。(https://github.com/iontorrent/TS) 它有很多依赖项(如armadillo、blas、lapack、atlas等)。
在编译时,没有出现任何错误。问题是,创建的某些可执行文件无法正常工作,并且没有其他信息,会抛出Illegal Instruccion。我正在使用GCC 4.8.2在CentOS 5.6上进行操作。
我想知道如何调试这些可执行文件,以便检查我的系统中哪个库或代码出现了问题。
./tvc
tvc 4.0-7 () - Torrent Variant Caller

Illegal instruction

我认为问题出在 LAPACK/BLAS/CBLAS 上。 我对如何从源代码构建 LAPACK/BLAS 和 CBLAS 感到非常困惑(Centos 5 的 rpm 版本的 LAPACK/BLAS 已过时,需要 LAPACK 3.2.1)。 我知道如何编译 LAPACK 和 BLAS,但不知道如何安装 CBLAS。
谢谢。
编辑:
这个分析套件的提供者还提供了一个预先安装了 Ubuntu 和所有软件的 VM。 我查看了他们的 gcc 版本和配置:
gcc -v Using built-in specs. Target: x86_64-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.4.3-4ubuntu5.1'
--with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --program-suffix=-4.4 --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-plugin --enable-objc-gc --disable-werror --with-arch-32=i486 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu Thread model: posix gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5.1)

我的GCC配置:

Configured with: ../configure --prefix=/share/apps/local/gcc/4.8.2 --with-mpfr=/share/apps/local/gcc/4.8.2 --with-gmp=/share/apps/local/gcc/4.8.2 --with-as=/share/apps/local/binutils/2.24/bin/as --enable-languages=c,c++,fortran
Thread model: posix
gcc version 4.8.2 (GCC) 
3个回答

4
有几种可能性;但为了解决问题,请按照所述,在调试器中运行程序。
$ gdb ./tvc

从调试器中运行程序。注意:(gdb)是提示符。
(gdb) run

这应该会抛出非法指令;从这里开始运行

(gdb) bt full

这将告诉您非法指令发生的位置。

1
也许您使用的编译器设置生成的代码与您的CPU不兼容,或者您链接了一些针对其他CPU进行优化的库。特别是数字库通常有特殊的构建版本,以利用CPU的所有功能。例如,如果您使用的库是为使用SSE4指令构建的,但您的CPU稍旧,则可能会出现此错误。因此,请仔细阅读Lapack或Blas中哪个库适用于您的CPU。也许您需要为您的CPU重新编译它。

我正在使用Centos 5可用的最新lapack/blas。我通过RPM安装了它们。 - gmarco
@Guillermo,既然你正在使用CentOS,这是Red Hat Enterprise Linux的一个不受支持的克隆版本,为什么不订阅真正的Red Hat并向其提交错误报告呢?这样做可能会更快地得到响应。 - mtall
@Guillermo 安装是否也意味着编译?如果不是,那么存储库中的二进制文件可能使用了您的 CPU 不支持的 CPU 功能。或者他们为不同的 CPU 提供多个二进制文件,而您链接了错误的二进制文件。也许您需要重新编译它,并查看如何仅使用您的 CPU 支持的 CPU 功能进行配置。类似于 CPU-Z(不知道 Linux 是否有类似软件)的工具可以帮助您识别您的 CPU 及其功能。 - vlad_tepesch
是的,安装也意味着编译它。我已经尝试过预编译和源代码。 - gmarco
@Guillermo,你也检查了配置是否与你的CPU能力匹配吗? - vlad_tepesch

-3

我想知道如何调试这些可执行文件。

首先在调试器中运行它。(这就是为什么它被称为调试器;它可以帮助您调试可执行文件)。

当程序出现"非法指令"错误时,调试器将能够向您显示失败的位置,并提供更多关于失败原因的信息。


也许值得注意的是,他应该使用调试标志重新编译。 - JorenHeit
你能推荐哪个调试器给我吗?请问需要使用“make -d”进行编译吗? - gmarco
你可以使用gdb。当你使用GCC时,只需添加-g即可启用调试符号。 - JorenHeit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接