非法指令调试
Illegal instruction debug
我已经编译了一套完整的生物信息学分析。(https://github.com/iontorrent/TS)它有很多依赖(armadillo, blas, lapack, atlas等)。
在编译时,我没有错误。问题是,一些可执行文件创建不工作,并抛出一个非法指令没有任何其他信息。我在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。
谢谢。
编辑:
提供这个分析套件的人他们还提供了一个预装了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)
有几种可能性;但是要解决这个问题,请按照
所述在调试器中运行该程序。$ gdb ./tvc
从调试器运行程序。注:(gdb)是提示符
(gdb) run
这应该抛出非法指令;从这里输入
(gdb) bt full
这将告诉您非法指令发生在哪里。
可能是您使用与CPU不兼容的代码生成编译器设置编译它。或者链接到针对其他cpu进行了优化的库。特别是数字库通常有特殊的构建来使用CPU的所有功能。例如,如果你使用的库是为使用SSE4指令而构建的,但你的CPU有点老,它可能会抛出这个错误。
因此,请仔细阅读您可以为CPU使用的软件包或blas库。
"我想知道如何调试这些可执行文件,"
首先在调试器中运行它。(这就是为什么它被称为调试器;它可以帮助你调试可执行文件)。
当程序在"Illegal Instruction"中失败时,调试器将能够显示它在哪里失败,并提供有关原因的更多信息。
- 当回溯以零开始时,如何调试崩溃
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- C++:对不存在的命名空间使用命名空间指令
- 在linux上调试巨大的C++项目
- 为什么使用__LINE_的代码在发布模式下在MSVC下编译,而不是在调试模式下
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 正在VS调试器中监视映射条目
- 使用调试/崩溃报告将应用程序部署到客户端
- VC++本机单元测试,找不到调试符号
- 函数名是c中该函数的第一条指令的地址吗
- 如何在C++生成器中禁用"使用调试.dcus"
- 使用vscode调试时,GDB意外退出
- 即使使用调试编译标志,表达式也是"optimized out"
- 错误:无效的预处理指令 #i 的意思是 #if?
- 调试 CUDA MMU 故障
- 小字符串优化(调试与发布模式)
- 组装指令中乘法的下部和上部是什么
- 如何将调试信息附加到LLVM通行证中的指令中
- 非法指令调试