解决软件报错如何“对症下药”

2022-01-05 09:43:43 浏览数 (2)

背景

在生物信息分析过程中常常会遇到各种错误,包括软件错误,文件错误,系统错误等,这些错误需要处理,否则分析无法进行,或者得到错误的信息。

一、认识软件错误

1.1 为什么会出错?

生物信息在 Linux 系统下采取命令行模式运行,命令行运行需要严格的执行标准,必须遵循严格的语法限制。相差一个字符都有可能无法运行,有些情况下多出一个空格可能就会有严重的影响,造成不可挽回的损失,例如下面这条命令:

代码语言:javascript复制
删除所有以 fq.gz 结尾的文件
rm -rf *.fq.gz #正确语法
rm -rf * .fq.gz #错误语法,通配符后多了一个空格

上面的代码中,本来是要删除所有以 fq.gz 结尾的文件,由于都了一个空格,就会将全部文件删除,造成重大损失。因此,在 Linux 系统命令行下操作,必须遵循严格的语法。否则软件就会提示错误,一般会给出相应的错误,可根据相应错误提示信息进行排错。

1.2 提示警告与报错

软件运行过程中一般会给出屏幕输出信息,屏幕输出信息并不是都是错误信息。有的是输出结果,是我们需要的内容;有时候是软件运行的提示信息,例如软件每一步都做了哪些,这都是正常显示;还有一些是警告信息,让你注意,最后就是错误信息 Error,这就需要特别处理了。错误信息对导致软件中断。在一些命令行终端中,错误信息会有红色颜色显示。下面分别进行介绍。

1.2.1 返回空白

运行之后没有任何返回结果,比如一个运行结束,直接返回命令行。这是正常现象。命令行操作的逻辑都是正确执行不提示,有问题才提示。

1.2.2 提示信息

一些操作需要给出一些提示信息,例如 fastqc 软件,则会返回一些提示信息,例如显示有百分之几的数据处理完了。这样就把软件运行的过程给详细展示出来,如果在哪一步出现问题,就一目了然了。这些都是注释信息,属于正常提示信息。

代码语言:javascript复制
nohup: ignoring input and appending output to `nohup.out'

忽略输入输出,将信息化信息记录到 nohup.out 文件中。

1.2.3 警告信息 Warnings

警告信息是一种比较令人迷惑的内容,但其实警告信息是非常重要的,很多人经常将警告信息和错误信息相混淆。警告信息并不影响软件运行,但是提示需要用户特别注意。比如加载 R 包的时候,提示当前的包是基于最新 R 版本构建的,用户使用的 R 版本与构建包的版本不一致,这个只是一个警告,并不影响包的使用,大部分情况下也不会影响结果。还有就是在做统计检验过程中,会提示你的数据模型太小,虽然也会返回结果,但可能存在

误差,需要用户注意。大家需要知道的就是警告信息并不影响软件执行,但是要特别注意。

1.2.4 错误信息 Error

最后一个比较重要的就是错误信息,错误信息也是经常会遇到的,错误信息直接给出 Error提示内容,终止掉软件的执行,必须处理,否则无法得到结果。不过很多软件的报错信息其实已经非常完善了,比如经常遇到的“command not found”,“No sucn file or dirctory",“ installation of package ‘Rcpp’ had non-zero exit status"等。遇到这种问题就需要根据经验分析错误,遇到多了才能知道该如何解决。或者直接将错误信息复制到搜索引擎里寻找解决方案。

1.3 错误提示关键字

错误提示会给出一些关键字,根据关键字进行判断。

语法问题:synatax

参数问题:argument

权限问题:permission

网络问题:connection

内存问题:dump

磁盘问题:disk

二、解决错误

在命令行模式下运行生物软件,主要考虑三个因素。软件,输入文件,选项参数。那么可能出错的地方也就在此,部分情况下也可能是硬件问题,比如资源不足。如果是像上面介绍过的错误,一般容易发现,比较好解决。但是软件、输入文件,选项参数都检查过了,还是提示错误,该如何解决呢?

2.1 学会分析问题

好的软件在内部都会有处理错误的机制,比如 perl 或者 python 的程序,一般会提示错误,面对错误,一定要做到,不要害怕。尝试阅读提示内容。如果发现里面有 Memory,那么就可能是和内存相关,是不是内存不够用了。如果是包含 Socket,那么可能是网络问题等;

2.2 Google 一下

你所遇到的问题,几乎别人都遇到过,所以,Google 一下,或者 bing 一下错误,看一下别人同样的问题是如何解决的,Google 几乎可以找到所有的报错内容。但是你最好要学会搜索,不要把好几页的错误内容都去 Google,要学会使用关键字,至于如何使用个关键字搜索,这个你自己 Google 一下吧。

2.3 控制单因素变量测试

如果以上方法都试了,还是找不到错误,就尝试控制单因素变量,进行测试。例如有这样的代码

代码语言:javascript复制
barplot(x,xlab='', ylab="genexpression",names.arg=c("Control","Cold",
"Osmotic", "Salt", "Drought", "Genotoxic", "Oxidative", "UV-B",
"Wounding","Heat"),col =
c(brewer.pal(9,"Blues")[1],brewer.pal(9,"Blues")[2],brewer.pal(9,"Blues")[3],b
rewer.pal(9,"Blues")[4],brewer.pal(9,"Blues")[5],brewer.pal(9,"Blues")[6],brew
er.pal(9,"Blues")[7],brewer.pal(9,"Blues")[8],brewer.pal(9,"Blues")[9]),cex.ax
is=1.5,cex.names=1.5,legend.text= c("0 Hour", "After 0.25 Hour", "After 0.5
Hour", "After 1 Hour", "After 3 Hours", "After 4 Hours", "After 6 Hours",
"After 12 Hours", "After 24 Hours"
),args.legend =list(x = "right",cex=1),beside=TRUE)
abline(h=0)

上面是一条很长的绘图函数。一次运行会出错,那么怎么办呢。这个时候就一点点筛选,到底是哪个地方出现了问题。

首先

代码语言:javascript复制
barplot(x)

如果没有问题,在一点点加选项,直到找到出错的地方为止,就是这样。而不是全部代码中去查找。

2.4 截取部分数据测试

如果感觉数据有问题,就换另外的小数据测试一下,或者截取部分进行测试。比如人基因组很大的数据,如果运行程序出错了,可以用 head 命令每个截取一部分进行测试。

三、常见错误

下面给出一些生物软件分析过程中常见问题。

3.1 command not found

这样的错误,原因就是软件没有安装,或者是软件路径没有写正确,还有一种可能是软件名写错了,或者没有区分大小写;

解决方案:

1、检测软件是否安装正确,有可执行程序,使用全路径试一下;

2、将软件可执行程序路径添加到.bashrc 文件中的 PATH 变量中

3.2 No such file or directory

如果敲软件名,软件可以运行,或者之前软件都可以运行,那么绝大部分就是输入文件的问题。输入文件经常出现“No such file or directory”,这就是因为输入文件路径写错了,在R 语言中“Error: object 'x' not found”的错误与之类似。那么检查一下这个对象是否存在,是否有值。

解决方案:

检查文件路径是否正确,文件是否存在;

3.3 文件格式

对于输入文件,另一个比较重要的错误就是文件格式。每一款软件都需要严格的输入文件格式,比如 fastq,fasta,sam,bam,vcf 等,不能随便输入。还有就是数量的问题,软件需要输入三个文件,你就不能输入两个,也不能输入四个。

3.4 软件选项参数

如果软件和输入文件都没有错误,那么就有可能是选项参数的问题。检查选项参数是否写正确,-i 是否写成-a 了,是否忘了加空格。一般这种情况下,软件不会运行,而是给出帮助信息。

3.5 Permission denied

这个是因为没有写的权限,就会提示,“Permission denied”,有些软件默认安装到系统目录,普通用户没有权限往这些路径写内容。

3.6 软件版本问题

系统中会存在多个软件版本,例如 python2 与 python3,要知道默认软件的版本,例如在命令行敲 python 或者 perl 的时候,要清楚使用具体软件的版本。一个好的方法是使用which 命令,可以查看软件的全路径。

3.7 网络问题

有些软件运行过程中需要联网,但出现错误代码 Http,403,404,connection 等关键字的时候,需要考虑网络连接问题。

3.8 文件问题

输入文件不存在,或者大小为空,文件不完整,或者输出文件已存在等。

not a regular file;

unexpected end of file;

File exists;

3.9 文件完整性校验

文件校验为了校验文件的完整性。有时候我们在下载文件的时候,一般比较大的文件,比如一个序列数据库,或者系统安装文件,文件都会附带一个 md5 文件,这个 md5 文件有什么作用的。

MD5 算法常常被用来验证网络文件传输的完整性,防止文件被人篡改。也就是验证下载的文件是否完成。比如在服务器端文件生成了一个 md5 校验码。下载之后,如果文件完整被下载了,那么就能校验通过,文件不完整, 则校验不出来,这个校验码很短,所以使用起来非常方便。md5 校验在计算机世界有着广泛的应用。

md5 算法是对任意长度的信息逐位进行计算,产生一个二进制长度为 128 位的“指纹”,转换成 16 进制则是 32 位的进制值。不同的文件产生相同的 md5 值的可能性是非常非常小的。

在 linux 系统中,可以使用 md5sum 生成 md5 校验码和用于文件校验。系统自带 md5sum命令,使用起来也非常容易,敲 md5sum 接文件就会生成 32 为 16 进制的数字,我们将这些数字保存到一个文件中,以点 md5 结尾。将这个文件传到另一台计算机上,可以使用md5sum -c 来进行校验。

如果文件前后没有发生变化,则会输出 OK,表示校验成功,文件是完整的。

代码语言:javascript复制
校验文件 gi_taxid_nucl.dmp.gz 完整性
ll gi_taxid_nucl.dmp.gz
md5sum -c gi_taxid_nucl.dmp.gz.md5

3.10 fatal error

Fatal error 意思为:致命的错误。

一般指内存读取出错因素为内存不够或故障另种是读取文件失败。文件是只读文件。第 2种是你的某些文件属性不该是只读,而设置成了只读。

四、缺少依赖配置

缺少依赖配置是生物信息分析中非常常见的一类问题,也是最难解决的问题。由于 Linux系统开源免费的特性,没有统一的集成开发环境,软件至今存在较强的依赖关系。往往安装一个软件,需要提前配置好一堆依赖环境。这类错误一般报错信息却提示缺少 xx 文件,一般各种库文件。下面给出几个案例,一般是将错误信息行信息复制到搜索引擎中搜索答案。

1、/usr/bin/ld: cannot find -lcrypto

代码语言:javascript复制
yum install -y openssl-devel

2、libXss.so.1()

代码语言:javascript复制
yum install libXScrnSaver.i686 libXScrnSaver.x86_64

3、configure: error: Could not find argtable2.h. Try $ ./configure CFLAGS='-Iyour-argtable2-include-path

代码语言:javascript复制
yum install -y argtable.x86_64 argtable-devel.x86_64

4、cannot find -lstdc

代码语言:javascript复制
yum install -y libstdc  .i686 libstdc  .x86_64 libstdc  -devel.i686 libstdc  -devel.x86_64 libstdc  -static.i686 libstdc  -static.x86_64 compat-libstdc  -33.i686 compat-libstdc  -33.x86_64

5、Can't locate strict.pm:

代码语言:javascript复制
Can't locate Text/Soundex.pm

6、 shared object ‘units.so’ not found

代码语言:javascript复制
yum install udunits2-devel

7、/usr/bin/ld: cannot find -lltdl

代码语言:javascript复制
yum install libtool-ltdl-devel

0 人点赞