
<?xml version="1.0" encoding="gb2312"?>
<rss version="2.0">

<channel>
<title>52RD Spaces，研发人员自己的博客</title>
<link>http://www.52RD.com/Blog/</link>
<description>52RD Spaces，研发人员自己的博客</description>
<copyright>52RD</copyright>
<generator>52RD Blog</generator>
<webMaster>webmaster_52rd@126.com</webMaster>
<item>
<title><![CDATA[52rd出问题了！]]></title>
<link>http://www.52RD.com/Blog/more.asp?name=Carrey&amp;id=3111</link>
<author>Carrey</author>
<pubDate>2006-8-2 23:28:00</pubDate>
<description><![CDATA[今天回复访客的留言变成了修改访客的留言，52rd的出来管管呀！同时，我也对不慎修改了留言的那位客人说声对不起，下次我一定注意看看是回复还是修改。]]></description>
</item><item>
<title><![CDATA[使用PostMessage()不当引起的非法操作]]></title>
<link>http://www.52RD.com/Blog/more.asp?name=Carrey&amp;id=2434</link>
<author>Carrey</author>
<pubDate>2006-6-7 22:58:00</pubDate>
<description><![CDATA[<P>今天不小心又找到一个Bug。Bug的现象是当某项操作的进度执行到100%以后就会出现非法操作。通过反汇编非操报告的模块和地址，定位到一个消息处理函数中。分析这个函数源代码，判断是由于消息处理函数的第二个参数为空或者野指针造成。于是，在追查所有发送这个消息的函数后，定位到一个线程主函数return前的PostMessage()调用中。这里调用的PostMessage()在第二个参数中传递了一个结构给出现非操的那个消息处理函数，这个结构是一个局部变量，而没有想到就在紧接着的return以后，整个线程就将结束，线程中使用的局部变量将自动被释放，因此，造成消息处理函数获得了一个野指针，故而非法操作。</P>
<P>总结：在使用PostMessage()发送消息，并向消息处理函数传递指针或者引用结构的时候，请一定考虑结构或者指针指向的实例是否在消息处理函数执行时还有效，使用局部的结构作为消息参数传递，不小心就会出现这种野指针错误，而且不容易查明原因。因此，PostMessage()的参数尽可能避免使用局部的结构变量作为参数。</P>]]></description>
</item><item>
<title><![CDATA[请节约使用递归函数中的局部变量]]></title>
<link>http://www.52RD.com/Blog/more.asp?name=Carrey&amp;id=2272</link>
<author>Carrey</author>
<pubDate>2006-5-26 23:04:00</pubDate>
<description><![CDATA[<P>如果你的函数是一个递归函数，请一定注意节约使用局部变量。因为一个线程的堆栈是有限的，局部变量总是保存在线程堆栈里面，要等到函数返回时才会释放。在递归调用中，因为递归函数没有返回，局部变量也就不会释放，直到所有递归完成。因此，每递归一次，递归函数中的局部变量就会吞噬线程堆栈中的一段空间，当线程堆栈被吞噬完后，就会出现寄存器ebp的值归零或者异常，从而导致局部变量混乱而出现非法操作。因此，在递归函数中，如果需要声明一个上百字节的数组或者结构，最好采用new方式，这样局部变量就由数组或者结构变成了指针，从而也能增加递归的次数（深度），呵呵。</P>]]></description>
</item><item>
<title><![CDATA[Driver Debug一例]]></title>
<link>http://www.52RD.com/Blog/more.asp?name=Carrey&amp;id=2241</link>
<author>Carrey</author>
<pubDate>2006-5-24 23:07:00</pubDate>
<description><![CDATA[<P>今天下班正准备回家，被一位同事叫住帮忙解决一个Driver蓝屏的Bug。初看起来蓝屏是出现在自己的Driver里面，并且Softice没有拦截到这个错误。用Windbg打开蓝屏的Dump文件，Windbg告知蓝屏出现在Driver的xxxx位置。然后在Softice中设置好Driver的源码文件，使用Softice的mod指令找到该Driver的基地址，蓝屏代码的位置应该就在基地址+xxxx的附近。使用u指令反汇编这个位置的代码，正好在一个名为BT_xxx()的函数中。在该函数的入口设下断点，然后试图重现这个蓝屏Bug。当Softice在断点位置停了下的时候开始单步跟踪。靠！原来是个除零错误。</P>
<P>总结一下：<BR>1、首先获得蓝屏的Dump文件。<BR>2、然后用Windbg查到蓝屏代码在Driver中的偏移地址。<BR>3、在Softice中设置好调试Driver的源码文件。<BR>4、然后使用Softice的mod指令找到调试Driver的基地址。造成蓝屏的代码位置应该就在 基地址+偏移地址附近。<BR>5、再使用Softice的u指令反汇编这个地址的代码，在怀疑的代码位置设下断点。<BR>6、下面开始重现蓝屏Bug，当Softice在断点位置停下来后，就开始单步调试。祝你好运！</P>]]></description>
</item><item>
<title><![CDATA[今天我的Blog开张了]]></title>
<link>http://www.52RD.com/Blog/more.asp?name=Carrey&amp;id=2218</link>
<author>Carrey</author>
<pubDate>2006-5-23 23:22:00</pubDate>
<description><![CDATA[常常听到和看到一些关于Blog的事情，一直都不以为然。前几天，公司让我分析如何解决Vista权限的<FONT size=2>UAP</FONT>问题，苦于资料短缺，把我折腾了半天，最后没想到在一位微软RD的Blog上找到了答案，一下子激起了我Blog的热情。]]></description>
</item>
</channel>
</rss>