标签: debugging

在 bash 脚本中找到丢失的引号的最简单方法?

我有一个 bash 脚本,目前有 700 多行。经过特别长时间的编辑,它现在出现如下错误:

./run_me.sh: line 693: unexpected EOF while looking for matching `''
./run_me.sh: line 702: syntax error: unexpected end of file
Run Code Online (Sandbox Code Playgroud)

但是,我可以看到第 693 行没有任何问题。它甚至没有引用。

我试过运行bash -x run_me.sh,并且可以看到最后一行运行,但该行也没有任何问题(该行和 693 之间的代码实际上是大部分代码)。

我可以注释掉整个代码,但是我更有可能看到由于缺少函数等而导致的错误,而不是我得到的 EOF 错误。

那么如果行号报告不正确,人们应该如何找到丢失的报价?

(无论如何,为什么 bash 的行号报告如此遥远?)

编辑

顺便说一句,我发现了我的特定错误(通过评论条带),这实际上是}在任意行号处的变量扩展中缺少错误消息指示的行——基于引号的语法突出显示在这里没有帮助,例如"${MY_ARRAY[@]"(应该是"${MY_ARRAY[@]}")中缺少的大括号。

bash debugging shell-script

8
推荐指数
3
解决办法
9642
查看次数

在 Linux/ARM 中跟踪库调用的工具

我正在寻找一种工具,它允许跟踪对 Linux/ARM 中共享库中函数的调用。基本上,我希望能够指定一个命令行并让这个工具生成被调用库函数和传递参数的记录。我想可以为此使用某种形式的函数挂钩。

我知道ltrace,它提供了我需要的功能。但是,ltrace对我不起作用,因为它:

  • 在跟踪更复杂的程序时经常出现段错误。
  • 很慢。

我正在寻找更强大的替代方案。速度不错,但不是我主要关心的问题。首先,我想有一种方法来跟踪可以分析任何(非回避)程序的库调用。

Sysdig 也不能在 ARM 中工作,并且 dtrace 的端口仍然只在 NetBSD 中处于测试阶段。

有没有人知道这种处于可用状态的工具?

linux debugging arm trace shared-library

8
推荐指数
1
解决办法
1117
查看次数

如果不是来自用户,我可以追踪 SIGINT 的来源吗?

我在 CentOS 7 机器上运行了一个长时间(3 小时)的 shell 脚本。该脚本运行一个带有内部循环的循环,并curl在每次迭代中调用。

我正在使用PM2启动脚本,因为它已经在系统上并且非常适合管理进程。但是,它似乎不适用于 shell 脚本。今天早上我进来的时候我看到PM2已经重新启动了我的shell脚本6次。PM2 日志说它收到了 SIGINT 并重新启动。由于此脚本导致数据被推送到数据库,这意味着我的数据已被推送 6 次。那不是布埃诺。

我是唯一登录该框的人,因此它不是其他用户。

因此,下一个问题是这是 PM2 中的错误还是合法的 SIGINT。这就引出了一个问题:如果它是合法的,它来自哪里?在我将其作为 PM2 中的错误提交之前(这似乎是最有可能的事情),我必须确定(如果可能)操作系统是否以某种方式终止了这个进程。

linux debugging signals

8
推荐指数
1
解决办法
4522
查看次数

set -eux 代替 set -x 在 Bash 配置文件中进行全局调试

当我使用 Bash 时,我喜欢使用突出的调试模式,所以每次我得到一台新机器时,我都会添加到~/.profile代码的末尾set -x

我也考虑添加eu,因此set -eux作为“最佳实践”。

如果我正确理解了BR 手册

  1. e 给了我不执行代码的好处,这些代码最终会返回一个非零(通常是错误的)输出。
  2. u - 我不太明白,男人说:

执行参数扩展时,将未设置的变量和特殊参数 '@' 或 '*' 以外的参数视为错误。错误消息将写入标准错误,并且非交互式 shell 将退出。

在我看来,这听起来很像,e但也将未设置的变量视为导致错误的变量,并以非零值退出。

对于寻求最佳“典型”调试的人来说,我在这里的理解是否准确并且set -euxset -x一般情况下更好?

bash debugging

8
推荐指数
1
解决办法
8881
查看次数

`set -x` 调试我的 `.zshrc`

当我用来set -x调试命令时,它会输出一些额外的行。

% set -x
+precmd_update_git_vars:1> [ -n '' ']'
+precmd_update_git_vars:1> [ '!' -n '' ']'
+precmd_update_git_vars:2> update_current_git_vars
+update_current_git_vars:1> unset __CURRENT_GIT_STATUS
+update_current_git_vars:3> [[ python == python ]]
+update_current_git_vars:4> _GIT_STATUS=+update_current_git_vars:4> python /home/ismail/zshfiles/gitstatus.py
+update_current_git_vars:4> _GIT_STATUS='' 
+update_current_git_vars:6> __CURRENT_GIT_STATUS=( '' ) 
+update_current_git_vars:7> GIT_BRANCH='' 
+update_current_git_vars:8> GIT_AHEAD='' 
+update_current_git_vars:9> GIT_BEHIND='' 
+update_current_git_vars:10> GIT_STAGED='' 
+update_current_git_vars:11> GIT_CONFLICTS='' 
+update_current_git_vars:12> GIT_CHANGED='' 
+update_current_git_vars:13> GIT_UNTRACKED='' 
+precmd_update_git_vars:3> unset __EXECUTED_GIT_COMMAND
Run Code Online (Sandbox Code Playgroud)

由于这些输出,我无法调试我的命令。

为什么set -x调试我的.zshrc?我set -x只想调试 后面的行set -x

command-line debugging zsh shell-script set

8
推荐指数
1
解决办法
6916
查看次数

什么是 Linux 本机调试符号格式?

GCC 文档说该-g选项以操作系统的本机格式(stabs、COFF、XCOFF 或 DWARF 2)生成调试信息

那么,什么是 Linux 原生调试符号格式呢?这叫什么?


更新:我刚刚发现了一个有 15 年历史的gcc 邮件列表讨论,据说当时的原生格式是 stabs,然后他们正在考虑切换到 DWARF2。但那是 15 年前的事了……有更新吗?=)

linux debugging

7
推荐指数
1
解决办法
4044
查看次数

鱼壳中的 xtrace 等效项

是否有等价于 POSIX shellset -xset -o xtrace导致 shell 显示在fishshell中运行的命令?

debugging fish

7
推荐指数
2
解决办法
695
查看次数

脚本中的内联调试 (xtrace)

有没有办法强制启用或禁用脚本中每个命令行的调试(xtrace)?

在 Windows Shell(“ms-dos”)中是一个“@”,它可以作为命令行的前缀,如果启用了回显(比如调试)(回显打开),则禁用该行显示。

考虑 (set -x) 上的 xtrace,但我们可以在某些行中忽略它的影响,它可以用“@”表示。像这样:

set -x
@echo Listing...
ls
set +x
Run Code Online (Sandbox Code Playgroud)

输出示例:

Listing...
+ ls
file1
file2
Run Code Online (Sandbox Code Playgroud)

shell 脚本中有类似的东西吗?

bash debugging shell-script

7
推荐指数
1
解决办法
9193
查看次数

调试内核模块

我正在 Raspberry Pi 上为 Raspbian(内核版本 4.9.24)开发网络驱动程序,每次加载模块时它都会崩溃。

使用日志/var/log/messages我已经能够判断出哪种方法失败了,但我仍然不知道它为什么失败。

May  7 17:15:29 raspberrypi kernel: [  228.384164] CPU: 0 PID: 1163 Comm: insmod Tainted: P           O    4.9.24+ #993
May  7 17:15:29 raspberrypi kernel: [  228.388503] Hardware name: BCM2835
May  7 17:15:29 raspberrypi kernel: [  228.390701] task: d888ed00 task.stack: da696000
May  7 17:15:29 raspberrypi kernel: [  228.392901] PC is at register_netdevice+0x20/0x4cc
May  7 17:15:29 raspberrypi kernel: [  228.395064] LR is at register_netdev+0x24/0x34
May  7 17:15:29 raspberrypi kernel: [  228.397106] pc : [<c04eea38>] …
Run Code Online (Sandbox Code Playgroud)

debugging kernel-modules network-interface

7
推荐指数
1
解决办法
638
查看次数

内核:BUG:无法处理地址的页面错误

我们的一台设备今天冻结并显示以下内核消息:

[79648.067306] BUG: unable to handle page fault for address: 0000000004000034
[79648.067315] #PF: supervisor read access in kernel mode
[79648.067318] #PF: error_code(0x0000) - not-present page
Run Code Online (Sandbox Code Playgroud)

从调用跟踪(见下文)来看,该错误似乎是由图形驱动程序(i915)引起的。据推测,内核更新可以解决该问题,但是,我对这个问题的背景感兴趣,所以我有 3 个问题:

  1. 这 3 行到底是什么意思,或者我在哪里可以找到这些错误的描述?
  2. 如果我启用硬件看门狗,出现此错误时是否会重新启动系统?
  3. 此错误是否是由于硬件(内存)故障导致的?

系统:5.4.0-91-generic,Ubuntu 20.04.1 LTS

内核环形缓冲区的完整转储 (dmesg):

[79648.067306] BUG: unable to handle page fault for address: 0000000004000034
[79648.067315] #PF: supervisor read access in kernel mode
[79648.067318] #PF: error_code(0x0000) - not-present page
[79648.067322] PGD 0 P4D 0
[79648.067328] Oops: 0000 [#1] SMP PTI
[79648.067335] CPU: 3 PID: 668 Comm: Xorg …
Run Code Online (Sandbox Code Playgroud)

logs debugging kernel

7
推荐指数
1
解决办法
1万
查看次数