首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用gdb调试Bourne Shell?

问如何用gdb调试Bourne Shell?
EN

Stack Overflow用户
提问于 2015-06-16 17:39:17
回答 1查看 799关注 0票数 2

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

脚本完美地运行,直到Perl部分在第416行前后运行。在Perl完成之后,当它解压缩sed时,它会抱怨这个错误:

代码语言:javascript
复制
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有关。

以下是一些有用的配置:

代码语言:javascript
复制
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附带了调试符号,所以我假设我必须重新编译才能包含这些符号?

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

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

编辑:$PROMETHEUS设置在我的根shell中。在Perl的末尾,cd ..会产生相同的结果,一个cd $PROMETHEUS/sources/。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-16 17:56:33

Shell附带了自己的调试工具。最简单的方法是使用-x (bash -x ...script...)运行它们,后者将在变量展开后但在执行之前打印每个命令。这通常足以决定问题的答案。

有关更多想法,请参见How to debug a bash script?

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

从代码来看,这一行似乎是最重要的:

代码语言:javascript
复制
cd $PROMETHEUS/sources/

在其他地方,您只需使用cd ..。如果没有定义PROMETHEUS (脚本没有定义它),这就变成了cd /sources/,它也应该失败,但不会中止您的脚本。试一试

代码语言:javascript
复制
cd $PROMETHEUS/sources/ || exit 1

而不是。此外,#!/bin/bash -u可能是有用的(对未定义的变量中止)。

最后,可以使用pushd和popd导航文件夹。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30874479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档