有时添加真的很方便
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?
您在跟踪与内存相关的问题时使用什么策略?您使用哪些工具(开源和专有)来识别内存泄漏、内存损坏等?如果系统上只有 gdb/dbx 可用,您将如何跟踪内存泄漏?
对我来说,仅使用调试器修复内存泄漏非常困难。
我有 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 监控,在冻结之前没有异常负载或活动。
我已经没有想法了;我还能做什么或检查什么?
崩溃的错误可能是最烦人的,导致数据丢失、停机和用户沮丧。如果应用程序崩溃更少,那就太好了。
由于机器上下文的复杂性,对于普通用户来说,通常无法在合理的时间内重现崩溃。这并不意味着该错误很少见——它可能只是意味着触发它的事情对于每个用户很少发生(例如 DST 更改)。除非很多用户报告这些错误,否则不太可能修复这些错误。如果报告更多的崩溃会很好。
为了调试崩溃,开发人员需要尽可能多的明确上下文。生成的崩溃报告很好,因为它们通常是详细而准确的。不能期望用户热情地手动观察和报告所有上下文,因此他们经常提交稀疏和错误的信息。
许多应用程序的目标受众不是开发人员或系统管理员,而是普通大众,在家中或工作中。不能期望此类用户知道如何手动收集崩溃信息或安装-dbg软件包,但此类用户生成的报告仍然可用。一些应用程序有自己的崩溃报告工具,但根据我的经验,这些工具很少起作用,当他们报告未能报告错误时,似乎没有任何关于如何手动执行此操作的信息(我已经观察到了这一点) Firefox 和 Flash 的最新版本)。系统范围内生成崩溃报告会很好。
是否有任何类型的崩溃报告生成* 可以全局启用**,而无需安装大量-dbg软件包、阅读每个应用程序的文档或将普通机器减慢到爬行速度?
* 日志、核心转储、堆栈跟踪等
** 不一定适用于init,但至少适用于在典型桌面 Linux 安装上运行的应用程序的重要子集。根据我的经验,GUI 应用程序崩溃的频率是 shell 应用程序的 100 多倍,因此 GUI 应用程序自然会成为焦点。
我正在尝试设置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 或其他原因)
在 bash 中,我可以写:
caller 0
Run Code Online (Sandbox Code Playgroud)
并接收调用者上下文的:
这对于调试非常有用。鉴于:
yelp () { caller 0; }
Run Code Online (Sandbox Code Playgroud)
然后我可以写yelp来看看到达了哪些代码行。
我可以实现caller 0在bash如下:
echo "${BASH_LINENO[0]} ${FUNCNAME[1]} ${BASH_SOURCE[1]"
Run Code Online (Sandbox Code Playgroud)
我怎样才能获得相同的输出caller 0中zsh?
自从我在 Arch Linux 上“升级”到 systemd 以来,当发生意外锁定时,我不断丢失日志。一个月前我遇到了同样的日志丢失问题,然后又遇到了这个问题。还有其他独立的确认。
情况:
(顺便说一句,我正在运行 Linux v3.8-rc5-218-ga56e160)
那么,如何确保在由于锁定而异常重启时保留我的日志?
我在 CentOS 7 机器上运行了一个长时间(3 小时)的 shell 脚本。该脚本运行一个带有内部循环的循环,并curl在每次迭代中调用。
我正在使用PM2启动脚本,因为它已经在系统上并且非常适合管理进程。但是,它似乎不适用于 shell 脚本。今天早上我进来的时候我看到PM2已经重新启动了我的shell脚本6次。PM2 日志说它收到了 SIGINT 并重新启动。由于此脚本导致数据被推送到数据库,这意味着我的数据已被推送 6 次。那不是布埃诺。
我是唯一登录该框的人,因此它不是其他用户。
因此,下一个问题是这是 PM2 中的错误还是合法的 SIGINT。这就引出了一个问题:如果它是合法的,它来自哪里?在我将其作为 PM2 中的错误提交之前(这似乎是最有可能的事情),我必须确定(如果可能)操作系统是否以某种方式终止了这个进程。
当我使用 Bash 时,我喜欢使用突出的调试模式,所以每次我得到一台新机器时,我都会添加到~/.profile代码的末尾set -x。
我也考虑添加eu,因此set -eux作为“最佳实践”。
如果我正确理解了BR 手册
e 给了我不执行代码的好处,这些代码最终会返回一个非零(通常是错误的)输出。u - 我不太明白,男人说:执行参数扩展时,将未设置的变量和特殊参数 '@' 或 '*' 以外的参数视为错误。错误消息将写入标准错误,并且非交互式 shell 将退出。
在我看来,这听起来很像,e但也将未设置的变量视为导致错误的变量,并以非零值退出。
对于寻求最佳“典型”调试的人来说,我在这里的理解是否准确并且set -eux比set -x一般情况下更好?
当我用来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。