<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Drangon&#039;s blog</title>
		<link>http://www.drangon.org/blog/index.php</link>
		<description><![CDATA[No Footer]]></description>
		<copyright>Copyright 2012, drangon</copyright>
		<managingEditor>drangon</managingEditor>
		<language>zh-CN</language>
		<generator>SPHPBLOG 0.5.1</generator>
		<item>
			<title>一个网络收发的bug的调试所想到的</title>
			<link>http://www.drangon.org/blog/index.php?entry=entry090214-120221</link>
			<description><![CDATA[软件bug调试最重要的是什么？我认为最重要的是基本功和思路。<br />基本功包括对程序运行的理解，各种关键信息，以及工具使用的熟悉，能够获取相应的信息。<br />但即使有好的工具，也能熟练运用，如果没有清晰的思路，也会事倍功半。<br />调试的思路，主要是根据bug出现和不出现的对比，以及程序本身的流程，推断问题可能存在的地方，提出一些验证方法，经过验证，逐步缩小范围，最终定位。<br />这个过程中，最复杂的是推断，其次是验证方法，至于验证过程，只是体力活而已。<br />而且在推断过程，要有适当的怀疑一切的想法，一些你以为绝无问题的地方，可能是个陷阱。<br /><br />在刚开始写小程序的时候，当发现结果不对时，往往是使用debuger，一步一步的单步执行，进行调试。<br />但当程序规模较大时，特别是涉及到多线程多进程交互时，长时间运行才出现bug时，往往很难再单步执行调试，此时更需要明确思路，在关键点设断点或者打印日志，进行验证。<br />从这个意义上来说，是否有IDE，调试器是否强大，重要性已经降低。<br /><br />前段时间一个网络收发程序出现一个bug。A机器上的程序P不停的向B机器的程序Q发送UDP包，刚开始是正常的，但过了一段时间后，P发包没停，但Q却收不到包了。<br />P和Q都是有比较复杂的逻辑，在发包和收包的地方加断点可以验证有没有数据包发送和接收到。<br />但在此之前，先理一下思路，Q没有收到包的原因是什么？<br />大概是下面几点：P没有发出去，Q没有去接收，数据包中途被丢了。<br />先在P发包代码加断点，证实是有发送出去的。<br />在Q接收包代码加断点，证实是有调用recv函数，但却超时了，没有收到数据。<br />那么数据包是丢掉了，然后在A、B的机器上抓包，都能抓到数据包。<br /><br />这下好像进入死胡同了，机器收到包，程序却收不到，总不能怀疑操作系统内部的bug吧。<br />如果基本功比较强大的话，可能可以推测出是什么原因。<br />但一般情况下，我们应该怎样处理呢？<br /><br />前面提到，刚开始的时候是正常的，只是过了几十分钟才不正常，调试一次也不容易啊，要等几十分钟才能重现的。<br />查找线索的一个重要方法，就是对比正常和不正常的情况。<br />首先，要拿到程序不正常的那个时间点，这个可以通过日志来获取。<br />然后对比这个时间点附近的各种信息对比，除了程序日志外，还要抓到的包的对比。<br />（btw，机器最好通过NTP等方式，保证时间同步，这样便于获取统一的时间点。）<br /><br />这个数据包看上去也没什么问题啊。。。。好像没什么问题啊。。。。好像。。。。<br />What？数据包的dest MAC地址怎么变了？<br />前面再看看，怎么有个古怪的ARP包。。。。<br /><br />BUG的原因，网络环境混合了路由器和HUB，某个路由器发神经，发送了一个错误的ARP包（怀疑是病毒，但没找到），导致A机器将B的MAC地址记成是另外一个，B接在HUB上，所以收到A发送的包，但由于MAC地址不对，结果被操作系统丢弃了。<br /><br />]]></description>
			<category>技术讨论</category>
			<guid isPermaLink="true">http://www.drangon.org/blog/index.php?entry=entry090214-120221</guid>
			<author>drangon</author>
			<pubDate>Sat, 14 Feb 2009 04:02:21 GMT</pubDate>
			<comments>http://www.drangon.org/blog/comments.php?y=09&amp;m=02&amp;entry=entry090214-120221</comments>
		</item>
		<item>
			<title>ffmpeg的windows版本编译方法</title>
			<link>http://www.drangon.org/blog/index.php?entry=entry090125-180326</link>
			<description><![CDATA[ffmpeg库的强大就不多说了。但ffmpeg用了很多gcc的特性，所以不能用VC来编译，所以需要借助mingw。<br /><br />直接在windows下编译需要MSYS环境，也可以在linux下交叉编译。我是使用mingw-w64来进行编译的。<br />配置命令如下：<br /><code><br />../ffmpeg/configure --cross-prefix=/compile/mingw/cross/bin/x86_64-pc-mingw32-  \<br />--enable-memalign-hack \<br />--disable-devices \<br />--enable-debug=3 --disable-optimizations --disable-stripping \<br />--prefix=/home/drangon/work_media/ffmpeg-svn/bm64/out<br /></code><br />配置前需要先将configure文件中的“check_cflags -std=c99&quot;一行注释掉，配置完之后，需要修改config.h和config.mak，分别修改”#define HAVE_DOS_PATHS 1“和增加”HAVE_DOS_PATHS=yes“。<br /><br />mingw-w64环境下的编译工具和库可以在<a href="http://www.drangon.org/mingw/" target="_blank" >这里</a>下载。<br /><br />下一步再试试将这些库打包成VC能够使用的库。<br />]]></description>
			<category>mingw</category>
			<guid isPermaLink="true">http://www.drangon.org/blog/index.php?entry=entry090125-180326</guid>
			<author>drangon</author>
			<pubDate>Sun, 25 Jan 2009 10:03:26 GMT</pubDate>
			<comments>http://www.drangon.org/blog/comments.php?y=09&amp;m=01&amp;entry=entry090125-180326</comments>
		</item>
		<item>
			<title>vmware的scsi问题</title>
			<link>http://www.drangon.org/blog/index.php?entry=entry081028-230636</link>
			<description><![CDATA[vmware的scsi硬件模拟似乎问题多多，早期的版本中，kernel检查到的设备数量为0，需要修改kernel代码，直接指定有16个scsi设备，才会检查具体的设备。这个bug在vmware server 2.x和vmware workstation 6.x中修补了。<br /><br />最新的kernel 2.6.27又出另外一个问题，系统启动时会发现不了scsi硬盘。导致启动失败。<br /><br />这次修补相对简单一些，只需要在挂载完scsi的模块后，在激活swap和switchroot之前，增加挂载scsi_wait_scan模块就可以。<br />为了增加这个模块，最简单的方法，就是修改 /etc/sysconfig/mkinitrd 文件，增加下列一行：<br />&lt;code&gt;<br />MODULES=scsi_wait_scan<br />&lt;/code&gt;<br />然后重新执行mkinitrd就可以了。<br /><br />]]></description>
			<category>技术讨论</category>
			<guid isPermaLink="true">http://www.drangon.org/blog/index.php?entry=entry081028-230636</guid>
			<author>drangon</author>
			<pubDate>Tue, 28 Oct 2008 15:06:36 GMT</pubDate>
			<comments>http://www.drangon.org/blog/comments.php?y=08&amp;m=10&amp;entry=entry081028-230636</comments>
		</item>
		<item>
			<title>小站又开张啦。。。。</title>
			<link>http://www.drangon.org/blog/index.php?entry=entry081019-162641</link>
			<description><![CDATA[又开张啦，这次要坚持写点东西。。。。<br /><br />沙漠龙城，Reloading。。。。<br /><br />]]></description>
			<category></category>
			<guid isPermaLink="true">http://www.drangon.org/blog/index.php?entry=entry081019-162641</guid>
			<author>drangon</author>
			<pubDate>Sun, 19 Oct 2008 08:26:41 GMT</pubDate>
			<comments>http://www.drangon.org/blog/comments.php?y=08&amp;m=10&amp;entry=entry081019-162641</comments>
		</item>
	</channel>
</rss>

