热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

看文档还是看源代码+调试附带rsyslog的例子

看源代码要比看文档高效多了。文档是用自然语言写的,比如英语,日语,中文等等,文化的差异以及各种语法的不同使得文档理解起来很不

看源代码要比看文档高效多了。文档是用自然语言写的,比如英语,日语,中文等等,文化的差异以及各种语法的不同使得文档理解起来很不方便,再说很多人根本就没有外语阅读的能力。自然语言还是相对比较复杂的,可是编程语言就简单多了,语法很简单,当前即使最高级的编程语言也还没有进化(如果它真的能进化的话)到足够复杂以至于必须学习额外的“文化”才能理解的地步,所有的编程语言都是简单的,因此用编程语言写就的源代码看起来就比理论文档易懂地多,前提是你要学习一些编程语言的语法哦!
经常听人说能看懂内核的人都是高手,其实并不是这样,看懂内核源码要比看懂一部历史著作容易多了,它都是流程化的,没有什么让你思考的东西,当然我指的仅仅是看懂而已,高手并不是看懂,而是彻底理解为何这么设计,归根结底还是人的思维在起作用,是设计者天才的大脑在起作用,背后是什么?背后还是文化,而文化的终极体现就是语言文字,自然语言文字,可以看出自然语言比编程语言高多少等级了吧。
很多人都认为源代码这种东西很难看懂,其实你只需要花顶多一个礼拜时间学点对应编程语言的语法,那么看懂局部就不成问题了,如果你再花一个礼拜学点操作上的知识,比如编译命令,调试步骤,在完全不理解这些原理的情况下你就可以看懂几乎全部代码了,所谓的难不在于代码本身难以理解,而是代码背后的设计难以理解,看linux内核源码很快,但是学习操作系统设计理论却很难,后者可能是用自然语言写成的一厚本书,可能混杂一些数学语言,可能没有一句编程语言,可能你要学十年--还不一定学的怎样!我们花了从不到1岁到x岁这么长的时间来学习说话,阅读和写作,我们现在拿起一篇文档肯定会说它比源代码简单,实际上可能我们根本没有花一分钟在编程语言的语法学习上。
以一个例子结束本文。第一次使用rsyslogd的人可能都会遇到一个问题,那就是在快速记录日志的情况下,日志会丢失,也就是记录不完全,这是怎么回事呢?第一步当然是用ps找出rsyslogd对应的进程号,然后使用lsof确认它打开了/dev/log这个本地套接字,然后使用strace看看它此时在干什么,注意加上-F -f参数以防它派生子进程...或者使用rsyslog -d(debug)重新运行rsyslog,此时使用loger命令快速写几条日志(摘自《Linux Security Cookbook》9.28):
#!/bin/sh
PROG=`basename "$0"`
FACILITIES='auth authpriv cron daemon ftp kern lpr mail news syslog user uucp
local0 local1 local2 local3 local4 local5 local6 local7'
PRIORITIES='emerg alert crit err warning notice info debug'
for f in $FACILITIES
do
for p in $PRIORITIES
do
logger -p $f.$p "$PROG[$$]: testing $f.$p"
done
done
只要strace输出一个rsyslog的信息或者rsyslog -d输出一个信息,此时就在rsyslog源代码中顺着找下去,然后的做法有好几种,可以打印调试,也可以gdb断点调试...也可以只看代码先不调试--在打印debug信息附近寻找蛛丝马迹,终于发现了下面的逻辑,在action.c的actionWriteToAction中:
if(pAction->iSecsExecOnceInterval > 0 && pAction->iSecsExecOnceInterval + pAction->tLastExec > getActNow(pAction)) {
DBGPRINTF("action not yet ready again to be executed, onceInterval %d, tCurr %d, tNext %d\n",
(int) pAction->iSecsExecOnceInterval, (int) getActNow(pAction),
(int) (pAction->iSecsExecOnceInterval + pAction->tLastExec));
pAction->tLastExec = getActNow(pAction); /* re-init time flags */
FINALIZE;
}
pAction->tLastExec = getActNow(pAction); /* re-init time flags */
pAction->f_time = pAction->f_pMsg->ttGenTime;
什么也不用说了,就是它引起的了,那么此时我们看一下iSecsExecOnceInterval这个值是什么时候被给上值的,发现是iActExecOnceInterval赋值给iSecsExecOnceInterval的,进一步发现iActExecOnceInterval是一个配置参数:
CHKiRet(regCfSysLineHdlr((uchar *)"actionexeconlyonceeveryinterval", 0, eCmdHdlrInt, NULL, &iActExecOnceInterval, NULL));
于是我们只需要在配置文件rsyslog.conf中增加一行:$ActionExecOnlyOnceEveryInterval 0
就可以了,最后确认一下就是这样。这件事从发现这个问题算起到解决不到5分钟,如果看文档的话,我想5分钟是解决不了的,文件毕竟是人看的,学习用的,出了问题最好的解决办法就是调试+看源码,看不了源码的看堆栈,看字符串...总之要用计算机的方式去解决之,要知道,机器的问题要比人的问题更简单。



推荐阅读
  • Linux学习笔记:psef、ps aux、kill9
    一、查看进程命令1.ps命令Linux中的ps命令是ProcessStatus的缩写。ps命令用来列出系统中当前运行的那些进程。ps命令列出的是当前那些进程的快照,就 ... [详细]
  • etc杂七杂八的配置文件etc不是什么缩写,是andsoon(等等)的意思来源于法语的etcetera翻译成中文就是等等的意思.至于为什么在etc下面存放配置文件& ... [详细]
  • UNP总结 Chapter 12~14 IPv4与IPv6的互操作性、守护进程和inet超级服务器、高级I/O函数
    一、IPv4与IPv6的互操作性1.IPv4客户与IPv6服务器拥有双重协议栈的主机的一个基本特性就是:其上运行的IPv6服务器既能应付IPv4客户,又能应付IPv6客户。这是通过使用IPv4映射 ... [详细]
  • nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • GPS 校验和 代码_Linux recovery 移除签名校验
    原创作者:王锐,多年Linux系统、龙芯平台移植与优化研发经验,LinuxContributor、Mozillian。背景某个设备配套的刷 ... [详细]
  • 一、域名解析记录说明记录类型A:用来指定域名的IPv4地址(如:8.8.8.8),如果需要将域名指向一个IP ... [详细]
  • 1、概念共享内存:共享内存是进程间通信中最简单的方式之一。共享内存允许两个或更多进程访问同一块内存,就如同malloc()函数向不同进程返回了指向同一个 ... [详细]
  • ShiftLeft:将静态防护与运行时防护结合的持续性安全防护解决方案
    ShiftLeft公司是一家致力于将应用的静态防护和运行时防护与应用开发自动化工作流相结合以提升软件开发生命周期中的安全性的公司。传统的安全防护方式存在误报率高、人工成本高、耗时长等问题,而ShiftLeft提供的持续性安全防护解决方案能够解决这些问题。通过将下一代静态代码分析与应用开发自动化工作流中涉及的安全工具相结合,ShiftLeft帮助企业实现DevSecOps的安全部分,提供高效、准确的安全能力。 ... [详细]
  •    实现了uboot对非linuxkernel的引导。虽然有一个IH_TYPE_STANDALONE,但是没有实现。nnd.只能自己想办法。实现详细见 ... [详细]
  • linux 循环 cpu使用率脚本,Linux Shell脚本监视CPU利用率,达到设置的CPU利用率时发送电子邮件...
    有很多开源监控工具可用于监控Linux系统性能,当系统达到给定的阈值限制时,它将发送电子邮件警报。它监视CPU利用率、内存利用率、交换利用率、磁盘空间利 ... [详细]
  • JNI技术实践小结转自http:sett ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 一、概述nmon是一种在AIX与各种Linux操作系统上广泛使用的监控与分析工具,相对于其它一些系统资源监控工具来说,nmon所记录的信息是比较全面的 ... [详细]
  • 一、设置时区方法一:使用setup工具setup选择Timezoneconfiguration选择AsiaShanghai空格键勾选上System ... [详细]
author-avatar
mobiledu2502857577
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有