如何使用gdb调试Bourne Shell?

时间:2015-06-16 17:39:17

标签: bash gdb tar

我构建了一个工具链脚本来准备Linux构建环境。该脚本可在此处找到:https://github.com/mynameismevin/prometheus/blob/toolchain/ptool-make.sh

该脚本运行完美,直到第416行的Perl部分之后。完成Perl后,当它解压缩sed时,它会抱怨此错误:

tar (child): sed-4.2.2.tar.bz2: Cannot open: No such file or directory
tar (child): Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error is not recoverable: exiting now

但是,如果我手动运行这些部分,它会完成而不会出错。如果我将脚本分成ptool-make1.sh(以Perl结尾)和ptool-make2.sh(从sed开始)并按顺序运行它们,那么它们都完成而没有任何问题。此时,我断言问题不在于脚本,我想调试shell以查看它是否与shell有关。

以下是一些有用的配置:

user@ubuntu:~$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.2 LTS"
user@ubuntu:~$ bash --version
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
user@ubuntu:~$ ls -lh $(which bash)
-rwxr-xr-x 1 root root 998K Oct  7  2014 /bin/bash

我不认为Ubuntu bash带有调试符号,所以我想我必须重新编译才能包含那些?

运行脚本时,如何使用gdb调试shell?或者在脚本运行时如何将shell记录到文件中,以便在完成后用gdb打开它?我知道如何调试shell脚本,我不想调试脚本,我想调试shell。

编辑:它看起来不像Ubuntu bash带有开箱即用的调试符号。 Reading symbols from bash...(no debugging symbols found)...done.

编辑:我的root shell中设置了$PROMETHEUS。在Perl cd ..结束时会产生相同的结果cd $PROMETHEUS/sources/

1 个答案:

答案 0 :(得分:2)

shell带有自己的调试工具。最简单的是使用-xbash -x ...script...)运行它们,它将在变量扩展之后但在执行之前打印每个命令。这通常足以确定问题。

有关更多提示,请参阅How to debug a bash script?

您还应该考虑编写辅助函数以将脚本的大小减少到几行。您可以移动特殊选项以将步骤配置或后构建到额外文件中,并在辅助函数中运行它们(如果存在)。

查看代码,似乎这一行是罪魁祸首:

cd $PROMETHEUS/sources/

在其他任何地方,您只需使用cd ..。如果PROMETHEUS未定义(脚本没有定义它,那么它将成为cd /sources/,它也会失败,但不会中止您的脚本。尝试

cd $PROMETHEUS/sources/ || exit 1

代替。另外#!/bin/bash -u可能有用(对未定义的变量进行中止)。

最后,您可以使用pushdpopd来浏览文件夹。