标签: debugging

使用“set -x”添加注释

有时添加真的很方便

set -x
Run Code Online (Sandbox Code Playgroud)

到脚本顶部以在执行之前显示所有命令。

创建具有体面输出的脚本只有一个缺点:我不知道如何以这种方式将文本输出添加到脚本中。如果我使用

echo 'some comment'
Run Code Online (Sandbox Code Playgroud)

它会导致打印结果翻倍:

+ echo 'some comment'
some comment
Run Code Online (Sandbox Code Playgroud)

如果我使用#它根本不显示。

如何添加打印出来的注释echo?如果我使用set -x?

bash debugging output

10
推荐指数
2
解决办法
1332
查看次数

如何在 *nix 系统上的大型 C/C++ 代码中跟踪/修复与内存相关的问题

您在跟踪与内存相关的问题时使用什么策略?您使用哪些工具(开源和专有)来识别内存泄漏、内存损坏等?如果系统上只有 gdb/dbx 可用,您将如何跟踪内存泄漏?

对我来说,仅使用调试器修复内存泄漏非常困难。

debugging memory-leaks

9
推荐指数
2
解决办法
5871
查看次数

调试 Linux 机器死机

我有 15 个相同的 Linux RH 4.7 64 位服务器。他们运行集群数据库(集群是应用程序级别)。有时(每个月左右)一个随机的盒子(虽然从不一样)会冻结。

我可以 ping 盒子并且 ping 工作。如果我尝试在框中 ssh,我会得到:

ssh_exchange_identification: Connection closed by remote host
Run Code Online (Sandbox Code Playgroud)

SSH 设置正确。

当我去机房,尝试直接登录控制台时,我可以用Alt+切换控制台Fn,我可以输入用户名,并且显示字符,但是按Enter之后没有任何反应。我等了 8 个小时一次,它没有改变。

我设置了 syslog 以将所有内容记录到远程主机,但这些日志中没有任何内容。当我重新启动机器时,它可以正常工作。我已经运行了硬件测试 - 一切正常,日志中没有任何内容。机器也由 NAGIOS 监控,在冻结之前没有异常负载或活动。

我已经没有想法了;我还能做什么或检查什么?

linux debugging freeze

9
推荐指数
1
解决办法
4767
查看次数

如何全局启用崩溃报告/核心转储/堆栈跟踪日志?

崩溃的错误可能是最烦人的,导致数据丢失、停机和用户沮丧。如果应用程序崩溃更少,那就太好了。

由于机器上下文的复杂性,对于普通用户来说,通常无法在合理的时间内重现崩溃。这并不意味着该错误很少见——它可能只是意味着触发它的事情对于每个用户很少发生(例如 DST 更改)。除非很多用户报告这些错误,否则不太可能修复这些错误。如果报告更多的崩溃会很好。

为了调试崩溃,开发人员需要尽可能多的明确上下文。生成的崩溃报告很好,因为它们通常是详细而准确的。不能期望用户热情地手动观察和报告所有上下文,因此他们经常提交稀疏和错误的信息。

许多应用程序的目标受众不是开发人员或系统管理员,而是普通大众,在家中或工作中。不能期望此类用户知道如何手动收集崩溃信息或安装-dbg软件包,但此类用户生成的报告仍然可用。一些应用程序有自己的崩溃报告工具,但根据我的经验,这些工具很少起作用,当他们报告未能报告错误时,似乎没有任何关于如何手动执行此操作的信息(我已经观察到了这一点) Firefox 和 Flash 的最新版本)。系统范围内生成崩溃报告会很好。

是否有任何类型的崩溃报告生成* 可以全局启用**,而无需安装大量-dbg软件包、阅读每个应用程序的文档或将普通机器减慢到爬行速度?

* 日志、核心转储、堆栈跟踪等

** 不一定适用于init,但至少适用于在典型桌面 Linux 安装上运行的应用程序的重要子集。根据我的经验,GUI 应用程序崩溃的频率是 shell 应用程序的 100 多倍,因此 GUI 应用程序自然会成为焦点。

debugging

9
推荐指数
1
解决办法
9254
查看次数

wpa_cli 级别命令总是失败

我正在尝试设置wpa_cli使用 level 命令的调试级别。无论我使用交互模式还是直接命令,级别命令总是失败。

wpa_cli -i wlan0 level 1

=> FAIL
Run Code Online (Sandbox Code Playgroud)

和交互模式:

wpa_cli
wpa_cli v2.3
Copyright (c) 2004-2014, Jouni Malinen <j@w1.fi> and contributors

This software may be distributed under the terms of the BSD license.
See README for more details.


Selected interface 'wlan0'

Interactive mode

> level 5
FAIL
Run Code Online (Sandbox Code Playgroud)

让它发挥作用的正确方法是什么?

我正在尝试获取连接失败时的调试消息(由于错误的 psk 或其他原因)

debugging wpa wpa-cli

9
推荐指数
1
解决办法
5613
查看次数

zsh 中函数的调用上下文:相当于 bash `caller`

在 bash 中,我可以写:

caller 0
Run Code Online (Sandbox Code Playgroud)

并接收调用者上下文的:

  • 电话号码
  • 功能
  • 脚本名称

这对于调试非常有用。鉴于:

yelp () { caller 0; }
Run Code Online (Sandbox Code Playgroud)

然后我可以写yelp来看看到达了哪些代码行。

我可以实现caller 0bash如下:

echo "${BASH_LINENO[0]} ${FUNCNAME[1]} ${BASH_SOURCE[1]"
Run Code Online (Sandbox Code Playgroud)

我怎样才能获得相同的输出caller 0zsh

shell debugging zsh function

9
推荐指数
1
解决办法
1619
查看次数

调试锁定 - systemd 丢失了我的日志

自从我在 Arch Linux 上“升级”到 systemd 以来,当发生意外锁定时,我不断丢失日志。一个月前我遇到了同样的日志丢失问题,然后又遇到了这个问题。还有其他独立的确认

情况:

  • 在用 Java 和与网络相关的实用程序做一些事情时,我看到 KDE(时钟)被冻结了。CPU风扇变得嘈杂并且热量上升。鼠标指针仍然可以移动。
  • 我试图从另一台机器 ssh (由于“没有到主机的路由”而失败)
  • 我等了几分钟,也许 NMI 看门狗可以杀死有问题的任务。没有骰子。
  • Ctrl+ Alt+F1没有任何工作,即使经过SysRq+R
  • 由于上述步骤不起作用,我决定发出 SysRq 序列 REI。之后E,屏幕变黑,但也没有控制台。甚至在SysRq+K
  • 所以,这个会话似乎丢失了,唯一可以做的就是收集调试信息。查看Wikipedia,我决定按SysRq+ d(显示锁定)等。
  • SysRq+ 后,S我等了一秒钟,然后用SysRq+重新启动B
  • 重新启动并登录控制台后,我没有看到任何崩溃的痕迹。最近记录的条目来自使用 Wireshark,但仍有 45 分钟的间隔。

(顺便说一句,我正在运行 Linux v3.8-rc5-218-ga56e160)

那么,如何确保在由于锁定而异常重启时保留我的日志?

logs debugging systemd systemd-journald

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

如果不是来自用户,我可以追踪 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
查看次数