非法指令调试

时间:2014-03-17 12:24:39

标签: c++ compilation bioinformatics lapack suite

我编制了一整套生物信息学分析。 (https://github.com/iontorrent/TS) 它有很多依赖(犰狳,blas,lapack,atlas等)。

编译时我没有错误。问题是创建的某些可执行文件不起作用并抛出 Illegal Instruccion 而没有任何其他信息。我在CentOS 5.6上使用GCC 4.8.2。

我想知道如何调试这些可执行文件,因此我可以检查系统中的哪个库或代码是错误的。

./tvc
tvc 4.0-7 () - Torrent Variant Caller

Illegal instruction

我认为问题在于LAPACK / BLAS / CBLAS。 我对如何从源代码构建LAPACK / BLAS和CBLAS感到困惑。 (rpm版本的LAPACK / BLAS在Centos 5中已过时,此软件套件需要LAPACK 3.2.1)。 我知道如何编译LAPACK和BLAS,我不知道如何安装CBLAS。

谢谢。

编辑:

提供此分析套件的人员还为VM提供了预先安装的Ubuntu和所有软件。

我看了一下他们的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 个答案:

答案 0 :(得分:2)

有几种可能性;但是要按照说明在调试器中运行程序

$ gdb ./tvc

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

(gdb) run

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

(gdb) bt full

这将告诉你非法指令的发生地点。

答案 1 :(得分:1)

可能是您使用与您的CPU不兼容的代码生成的编译器设置编译它。或者你链接到一些针对其他cpu优化的库。 特别是数字库通常具有特殊构建以使用CPU的所有功能。例如,如果您使用构建的lib来使用SSE4指令但CPU有点旧,则可能会抛出此错误。

请仔细阅读您可以用于CPU的lapack或blas库。可能是你必须为你的cpu重新编译它。

答案 2 :(得分:-3)

“我想知道如何调试这些可执行文件,”

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

当程序因“非法指令”而失败时,调试器将能够显示失败的位置,并提供有关原因的更多信息。

相关问题