??xml version="1.0" encoding="utf-8" standalone="yes"?>精品久久久久久久久亚洲偷窥女厕,亚洲伊人久久精品影院,国产精品亚洲精品http://m.tkk7.com/lilan1983/Beyond Technology!!!zh-cnMon, 12 May 2025 11:33:48 GMTMon, 12 May 2025 11:33:48 GMT60实现拦截?/title><link>http://m.tkk7.com/lilan1983/archive/2005/12/28/25771.html</link><dc:creator>李岚</dc:creator><author>李岚</author><pubDate>Wed, 28 Dec 2005 11:02:00 GMT</pubDate><guid>http://m.tkk7.com/lilan1983/archive/2005/12/28/25771.html</guid><wfw:comment>http://m.tkk7.com/lilan1983/comments/25771.html</wfw:comment><comments>http://m.tkk7.com/lilan1983/archive/2005/12/28/25771.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/lilan1983/comments/commentRss/25771.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/lilan1983/services/trackbacks/25771.html</trackback:ping><description><![CDATA[     摘要: 背景Q?拦截器是现在很多E序必须的一个东ѝ比如要在某个方法的前后做些处理Q在一些特定的情况下可能会(x)D大量的重复代码。而假如我们拥有了cM拦截器一L(fng)东西Q那我们可以Q意在自己希望的方法的执行前后做我们自q处理Q比如日志,取得参数或者是事务{?  实现Q?1Q首先定义一个业务接?  1/** *//** 3 *&nbs...  <a href='http://m.tkk7.com/lilan1983/archive/2005/12/28/25771.html'>阅读全文</a><img src ="http://m.tkk7.com/lilan1983/aggbug/25771.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/lilan1983/" target="_blank">李岚</a> 2005-12-28 19:02 <a href="http://m.tkk7.com/lilan1983/archive/2005/12/28/25771.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>p? 背媄http://m.tkk7.com/lilan1983/archive/2005/12/21/24984.html李岚李岚Wed, 21 Dec 2005 11:03:00 GMThttp://m.tkk7.com/lilan1983/archive/2005/12/21/24984.htmlhttp://m.tkk7.com/lilan1983/comments/24984.htmlhttp://m.tkk7.com/lilan1983/archive/2005/12/21/24984.html#Feedback19http://m.tkk7.com/lilan1983/comments/commentRss/24984.htmlhttp://m.tkk7.com/lilan1983/services/trackbacks/24984.html我与父亲不相见已二年余了Q我最不能忘记的是他的背媄。那q冬天,母MQ父亲的差也交怺Q正是祸不单行的日子Q我从北京到徐州Q打跟着父亲奔回家。到徐州见着父亲Q看见满院狼藉的东西Q又惌v母Q不簌地下眼泪。父亲说Q“事已如此,不必难过Q好在天无绝Z路!”回家变卖典质,父亲q了亏空Q又借钱办了丧事。这些日子,家中光景很是惨EQ一半ؓ(f)了事,一半ؓ(f)了父亲赋闌Ӏ事完毕,父亲要到南京谋事Q我也要回北京念书,我们便同行。到南京Ӟ有朋友约L逛,勄了一日;W二日上午便L江到口Q下午上车北厅R父亲因Z忙,本已说定不送我Q叫旅馆里一个熟识的茶房陪我同去。他再三嘱咐茶房Q甚是仔l。但他终于不攑ֿQ怕茶房不妥帖Q颇t躇了一?x)。其实我那年已二十岁Q北京已来往q两三次Q是没有甚么要紧的了。他t躇了一?x),l于军_q是自己送我厅R我两三回劝他不必去Q他只说Q“不要紧Q他们去不好Q”我们过了江Q进了R站。我买票Q他忙着照看行李。行李太多了Q得向脚夫行些小费,才可q去。他便又忙着和他们讲价钱。我那时真是聪明q分Q总觉他说话不大漂亮,非自己插嘴不可。但他终于讲定了价钱Q就送我上R。他l我拣定了靠车门的一张椅子;我将他给我做的毛大衣铺好坐位。他嘱我路上心Q夜里警醒些Q不要受凉。又嘱托茶房好好照应我。我心里暗笑他的q;他们只认得钱Q托他们直是白托Q而且我这样大q纪的hQ难道还不能料理自己么?唉,我现在想惻I那时真是太聪明了Q我说道Q“爸爸,你走吧。”他望R外看了看Q说Q“我买几个橘子去。你在此地Q不要走动。”我看那Ҏ(gu)台的栅栏外有几个卖东西的{着֮。走到那Ҏ(gu)収ͼȝq铁道,蟩下去又爬上去。父亲是一个胖子,走过去自然要费事些。我本来要去的,他不肯,只好让他厅R我看见他戴着黑布?yu)帽Q穿着黑布大马褂,深青布棉袍,y跚地走到铁道边Q慢慢探w下去,不大难。可是他I过铁道Q要爬上那边月台Q就不容易了。他用两手攀着上面Q两脚再向上~;他肥胖的w子向左微倾,昑և努力的样子。这时我看见他的背媄Q我的泪很快地流下来了。我赶紧拭干了泪Q怕他看见Q也怕别人看见。我再向外看Ӟ他已׃q的橘子望回走了。过铁道Ӟ他先橘子散攑֜CQ自己慢慢爬下,再抱h子走。到q边Ӟ我赶紧去搀他。他和我走到车上Q将子一股脑儿放在我的皮大衣上。于是扑扑衣上的泥土Q心里很L似的Q过一?x)说Q“我CQ到那边来信Q”我望着他走出去。他C几步Q回q头看见我,_(d)“进dQ里Ҏ(gu)人。”等他的背媄混入来来往往的h里,再找不着了,我便q来坐下Q我的眼泪又来了。近几年来,父亲和我都是东奔西走Q家中光景是一日不如一日。他年出外谋生Q独力支持,做了许多大事。那知老境却如此颓唐!他触目伤怀Q自然情不能自已。情郁于中,自然要发之于外;家庭琐屑便往往触他之怒。他待我渐渐不同往日。但最q两q的不见Q他l于忘却我的不好Q只是惦记着我,惦记着我的儿子。我北来后,他写了一信给我,信中说道Q“我w体q_Q惟膀子疼痛利宻I丄提笔Q诸多不便,大约大去之期不远矣。”我d此处Q在晶莹的泪光中Q又看见那肥胖的Q青布棉袍,黑布马褂的背影。唉Q我不知何时再能与他相见Q?/FONT>

李岚 2005-12-21 19:03 发表评论
]]>
Spring和W(xu)ebworkl合的方?/title><link>http://m.tkk7.com/lilan1983/archive/2005/11/23/21119.html</link><dc:creator>李岚</dc:creator><author>李岚</author><pubDate>Wed, 23 Nov 2005 05:52:00 GMT</pubDate><guid>http://m.tkk7.com/lilan1983/archive/2005/11/23/21119.html</guid><wfw:comment>http://m.tkk7.com/lilan1983/comments/21119.html</wfw:comment><comments>http://m.tkk7.com/lilan1983/archive/2005/11/23/21119.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/lilan1983/comments/commentRss/21119.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/lilan1983/services/trackbacks/21119.html</trackback:ping><description><![CDATA[<P><FONT size=2>前两U方式webwork的wiki里有Q就不多说了,<A >点这里可以查?/A>?BR>而以下的l出的思\是webwork mail list的讨论的一U方案,应该是最好的一U方案?BR><BR>代码1Q?/FONT></P> <DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><FONT size=2><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_505_2496_Open_Image onclick="this.style.display='none'; Codehighlighter1_505_2496_Open_Text.style.display='none'; Codehighlighter1_505_2496_Closed_Image.style.display='inline'; Codehighlighter1_505_2496_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_505_2496_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_505_2496_Closed_Text.style.display='none'; Codehighlighter1_505_2496_Open_Image.style.display='inline'; Codehighlighter1_505_2496_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000"> SpringContainer </SPAN><SPAN style="COLOR: #0000ff">implements</SPAN><SPAN style="COLOR: #000000"> Container </SPAN><SPAN id=Codehighlighter1_505_2496_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://m.tkk7.com/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_505_2496_Open_Text><FONT size=2><SPAN style="COLOR: #000000">{<BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top>    </SPAN><SPAN style="COLOR: #0000ff">private</SPAN></FONT><FONT size=2><SPAN style="COLOR: #000000"> ApplicationContext applicationContext;<BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG id=Codehighlighter1_617_726_Open_Image onclick="this.style.display='none'; Codehighlighter1_617_726_Open_Text.style.display='none'; Codehighlighter1_617_726_Closed_Image.style.display='inline'; Codehighlighter1_617_726_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_617_726_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_617_726_Closed_Text.style.display='none'; Codehighlighter1_617_726_Open_Image.style.display='inline'; Codehighlighter1_617_726_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>    </SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000"> SpringContainer(ServletContext servletContext) </SPAN><SPAN id=Codehighlighter1_617_726_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://m.tkk7.com/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_617_726_Open_Text><FONT size=2><SPAN style="COLOR: #000000">{<BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top>        </SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">.applicationContext </SPAN><SPAN style="COLOR: #000000">=</SPAN></FONT><SPAN style="COLOR: #000000"><FONT size=2> WebApplicationContextUtils.getWebApplicationContext(servletContext);<BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>    }</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=2><IMG src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG id=Codehighlighter1_795_855_Open_Image onclick="this.style.display='none'; Codehighlighter1_795_855_Open_Text.style.display='none'; Codehighlighter1_795_855_Closed_Image.style.display='inline'; Codehighlighter1_795_855_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_795_855_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_795_855_Closed_Text.style.display='none'; Codehighlighter1_795_855_Open_Image.style.display='inline'; Codehighlighter1_795_855_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>    </FONT></SPAN><FONT size=2><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000"> SpringContainer(ApplicationContext applicationContext) </SPAN><SPAN id=Codehighlighter1_795_855_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://m.tkk7.com/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_795_855_Open_Text><FONT size=2><SPAN style="COLOR: #000000">{<BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top>        </SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">.applicationContext </SPAN><SPAN style="COLOR: #000000">=</SPAN></FONT><SPAN style="COLOR: #000000"><FONT size=2> applicationContext;<BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>    }</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=2><IMG src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG id=Codehighlighter1_862_1012_Open_Image onclick="this.style.display='none'; Codehighlighter1_862_1012_Open_Text.style.display='none'; Codehighlighter1_862_1012_Closed_Image.style.display='inline'; Codehighlighter1_862_1012_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_862_1012_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_862_1012_Closed_Text.style.display='none'; Codehighlighter1_862_1012_Open_Image.style.display='inline'; Codehighlighter1_862_1012_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>    </FONT></SPAN><SPAN id=Codehighlighter1_862_1012_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><FONT size=2>/** */</FONT></SPAN><SPAN id=Codehighlighter1_862_1012_Open_Text><SPAN style="COLOR: #008000"><FONT size=2>/**</FONT></SPAN><SPAN style="COLOR: #008000"><BR><FONT size=2><IMG src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top>     * </FONT></SPAN><SPAN style="COLOR: #808080"><FONT size=2>@param</FONT></SPAN><FONT size=2><SPAN style="COLOR: #008000"> key<BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top>     *            component class type or component name<BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top>     * </SPAN><SPAN style="COLOR: #808080">@return</SPAN><SPAN style="COLOR: #008000"> </SPAN><SPAN style="COLOR: #808080">@throws</SPAN></FONT><SPAN style="COLOR: #008000"><BR><FONT size=2><IMG src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top>     *         ComponentNotFoundException<BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>     </FONT></SPAN><SPAN style="COLOR: #008000"><FONT size=2>*/</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=2><IMG id=Codehighlighter1_1091_2060_Open_Image onclick="this.style.display='none'; Codehighlighter1_1091_2060_Open_Text.style.display='none'; Codehighlighter1_1091_2060_Closed_Image.style.display='inline'; Codehighlighter1_1091_2060_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_1091_2060_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1091_2060_Closed_Text.style.display='none'; Codehighlighter1_1091_2060_Open_Image.style.display='inline'; Codehighlighter1_1091_2060_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>    </FONT></SPAN><FONT size=2><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000"> Object getComponent(Object key) </SPAN><SPAN style="COLOR: #0000ff">throws</SPAN><SPAN style="COLOR: #000000"> ComponentNotFoundException </SPAN><SPAN id=Codehighlighter1_1091_2060_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://m.tkk7.com/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_1091_2060_Open_Text><FONT size=2><SPAN style="COLOR: #000000">{<BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top>        </SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000"> (applicationContext </SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">null</SPAN></FONT><FONT size=2><SPAN style="COLOR: #000000">)<BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top>            </SPAN><SPAN style="COLOR: #0000ff">throw</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000"> IllegalStateException(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Spring Application context has not been set</SPAN><SPAN style="COLOR: #000000">"</SPAN></FONT><FONT size=2><SPAN style="COLOR: #000000">);<BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top>        </SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000"> (key </SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">null</SPAN></FONT><FONT size=2><SPAN style="COLOR: #000000">)<BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top>            </SPAN><SPAN style="COLOR: #0000ff">throw</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000"> ComponentNotFoundException(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">The component key can not be null</SPAN><SPAN style="COLOR: #000000">"</SPAN></FONT><FONT size=2><SPAN style="COLOR: #000000">);<BR><IMG id=Codehighlighter1_1371_1995_Open_Image onclick="this.style.display='none'; Codehighlighter1_1371_1995_Open_Text.style.display='none'; Codehighlighter1_1371_1995_Closed_Image.style.display='inline'; Codehighlighter1_1371_1995_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_1371_1995_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1371_1995_Closed_Text.style.display='none'; Codehighlighter1_1371_1995_Open_Image.style.display='inline'; Codehighlighter1_1371_1995_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>        </SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000"> (key </SPAN><SPAN style="COLOR: #0000ff">instanceof</SPAN><SPAN style="COLOR: #000000"> Class) </SPAN><SPAN id=Codehighlighter1_1371_1995_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://m.tkk7.com/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_1371_1995_Open_Text><FONT size=2><SPAN style="COLOR: #000000">{<BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top>            Map beans </SPAN><SPAN style="COLOR: #000000">=</SPAN></FONT><FONT size=2><SPAN style="COLOR: #000000"> applicationContext.getBeansOfType((Class) key);<BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top>            </SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000"> (beans </SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">null</SPAN></FONT><FONT size=2><SPAN style="COLOR: #000000">)<BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top>                </SPAN><SPAN style="COLOR: #0000ff">throw</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000"> ComponentNotFoundException(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">The container is unable to resolve single instance of </SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">+</SPAN></FONT><FONT size=2><SPAN style="COLOR: #000000"> ((Class) key).getName()<BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top>                        </SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">, none instances found</SPAN><SPAN style="COLOR: #000000">"</SPAN></FONT><FONT size=2><SPAN style="COLOR: #000000">);<BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top>            </SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000"> (beans.size() </SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">||</SPAN><SPAN style="COLOR: #000000"> beans.size() </SPAN><SPAN style="COLOR: #000000">></SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">1</SPAN></FONT><FONT size=2><SPAN style="COLOR: #000000">)<BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top>                </SPAN><SPAN style="COLOR: #0000ff">throw</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000"> ComponentNotFoundException(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">The container is unable to resolve single instance of </SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">+</SPAN></FONT><FONT size=2><SPAN style="COLOR: #000000"> ((Class) key).getName()<BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top>                        </SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">, number of instances found was: </SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #000000">+</SPAN></FONT><FONT size=2><SPAN style="COLOR: #000000"> beans.size());<BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top>            key </SPAN><SPAN style="COLOR: #000000">=</SPAN></FONT><SPAN style="COLOR: #000000"><FONT size=2> beans.keySet().iterator().next();<BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>        }</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=2><IMG src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top>        </FONT></SPAN><SPAN style="COLOR: #0000ff"><FONT size=2>return</FONT></SPAN><SPAN style="COLOR: #000000"><FONT size=2> applicationContext.getBean(key.toString());<BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>    }</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=2><IMG src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG id=Codehighlighter1_2088_2180_Open_Image onclick="this.style.display='none'; Codehighlighter1_2088_2180_Open_Text.style.display='none'; Codehighlighter1_2088_2180_Closed_Image.style.display='inline'; Codehighlighter1_2088_2180_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_2088_2180_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2088_2180_Closed_Text.style.display='none'; Codehighlighter1_2088_2180_Open_Image.style.display='inline'; Codehighlighter1_2088_2180_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>    </FONT></SPAN><FONT size=2><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000"> reload() </SPAN><SPAN id=Codehighlighter1_2088_2180_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://m.tkk7.com/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_2088_2180_Open_Text><SPAN style="COLOR: #000000"><FONT size=2>{<BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top>        close();<BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top>        ((AbstractApplicationContext) applicationContext).refresh();<BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>    }</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=2><IMG src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG id=Codehighlighter1_2230_2393_Open_Image onclick="this.style.display='none'; Codehighlighter1_2230_2393_Open_Text.style.display='none'; Codehighlighter1_2230_2393_Closed_Image.style.display='inline'; Codehighlighter1_2230_2393_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_2230_2393_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2230_2393_Closed_Text.style.display='none'; Codehighlighter1_2230_2393_Open_Image.style.display='inline'; Codehighlighter1_2230_2393_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>    </FONT></SPAN><FONT size=2><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000"> autowireComponent(Object bean) </SPAN><SPAN id=Codehighlighter1_2230_2393_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://m.tkk7.com/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_2230_2393_Open_Text><FONT size=2><SPAN style="COLOR: #000000">{<BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top>        ((AbstractApplicationContext) applicationContext).getBeanFactory().autowireBeanProperties(bean, AutowireCapableBeanFactory.AUTOWIRE_BY_NAME, </SPAN><SPAN style="COLOR: #0000ff">false</SPAN></FONT><SPAN style="COLOR: #000000"><FONT size=2>);<BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>    }</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=2><IMG src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG id=Codehighlighter1_2420_2493_Open_Image onclick="this.style.display='none'; Codehighlighter1_2420_2493_Open_Text.style.display='none'; Codehighlighter1_2420_2493_Closed_Image.style.display='inline'; Codehighlighter1_2420_2493_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_2420_2493_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2420_2493_Closed_Text.style.display='none'; Codehighlighter1_2420_2493_Open_Image.style.display='inline'; Codehighlighter1_2420_2493_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>    </FONT></SPAN><FONT size=2><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000"> close() </SPAN><SPAN id=Codehighlighter1_2420_2493_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://m.tkk7.com/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_2420_2493_Open_Text><SPAN style="COLOR: #000000"><FONT size=2>{<BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top>        ((AbstractApplicationContext) applicationContext).close();<BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>    }</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=2><IMG src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</FONT></SPAN></SPAN></DIV><BR><FONT size=2>代码2Q?BR></FONT> <DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><FONT size=2><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_206_574_Open_Image onclick="this.style.display='none'; Codehighlighter1_206_574_Open_Text.style.display='none'; Codehighlighter1_206_574_Closed_Image.style.display='inline'; Codehighlighter1_206_574_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_206_574_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_206_574_Closed_Text.style.display='none'; Codehighlighter1_206_574_Open_Image.style.display='inline'; Codehighlighter1_206_574_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000"> ComponentAutowireInterceptor </SPAN><SPAN style="COLOR: #0000ff">implements</SPAN><SPAN style="COLOR: #000000"> Interceptor </SPAN><SPAN id=Codehighlighter1_206_574_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://m.tkk7.com/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_206_574_Open_Text><FONT size=2><SPAN style="COLOR: #000000">{<BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG id=Codehighlighter1_236_285_Open_Image onclick="this.style.display='none'; Codehighlighter1_236_285_Open_Text.style.display='none'; Codehighlighter1_236_285_Closed_Image.style.display='inline'; Codehighlighter1_236_285_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_236_285_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_236_285_Closed_Text.style.display='none'; Codehighlighter1_236_285_Open_Image.style.display='inline'; Codehighlighter1_236_285_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>    </SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000"> destroy() </SPAN><SPAN id=Codehighlighter1_236_285_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://m.tkk7.com/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_236_285_Open_Text><FONT size=2><SPAN style="COLOR: #000000">{<BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top>        </SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000"> TODO Auto-generated method stub</SPAN></FONT><SPAN style="COLOR: #008000"><BR><FONT size=2><IMG src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top></FONT></SPAN><SPAN style="COLOR: #000000"><FONT size=2>    }</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=2><IMG src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG id=Codehighlighter1_311_360_Open_Image onclick="this.style.display='none'; Codehighlighter1_311_360_Open_Text.style.display='none'; Codehighlighter1_311_360_Closed_Image.style.display='inline'; Codehighlighter1_311_360_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_311_360_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_311_360_Closed_Text.style.display='none'; Codehighlighter1_311_360_Open_Image.style.display='inline'; Codehighlighter1_311_360_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>    </FONT></SPAN><FONT size=2><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000"> init() </SPAN><SPAN id=Codehighlighter1_311_360_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://m.tkk7.com/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_311_360_Open_Text><FONT size=2><SPAN style="COLOR: #000000">{<BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top>        </SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000"> TODO Auto-generated method stub</SPAN></FONT><SPAN style="COLOR: #008000"><BR><FONT size=2><IMG src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top></FONT></SPAN><SPAN style="COLOR: #000000"><FONT size=2>    }</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=2><IMG src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG id=Codehighlighter1_437_571_Open_Image onclick="this.style.display='none'; Codehighlighter1_437_571_Open_Text.style.display='none'; Codehighlighter1_437_571_Closed_Image.style.display='inline'; Codehighlighter1_437_571_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_437_571_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_437_571_Closed_Text.style.display='none'; Codehighlighter1_437_571_Open_Image.style.display='inline'; Codehighlighter1_437_571_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>    </FONT></SPAN><FONT size=2><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000"> String intercept(ActionInvocation invocation) </SPAN><SPAN style="COLOR: #0000ff">throws</SPAN><SPAN style="COLOR: #000000"> Exception </SPAN><SPAN id=Codehighlighter1_437_571_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://m.tkk7.com/images/dot.gif"></SPAN></FONT><SPAN id=Codehighlighter1_437_571_Open_Text><FONT size=2><SPAN style="COLOR: #000000">{<BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top>        Application.getInstance().getContainer().autowireComponent(invocation.getAction());<BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top>        </SPAN><SPAN style="COLOR: #0000ff">return</SPAN></FONT><SPAN style="COLOR: #000000"><FONT size=2> invocation.invoke();<BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>    }</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=2><IMG src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</FONT></SPAN></SPAN><SPAN style="COLOR: #000000"><BR><FONT size=2><IMG src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align=top></FONT></SPAN></DIV><BR><FONT size=2>q几D代码,你不需要在spring里配|a(chn)ctionQ也不需要在xwork.xml里面配置external-ref。只要保证action引用的东东和spring里面同名p够auto wire by name了?BR><BR>原理Q拦截器?x)在每个action之前调用autowireComponent(invocation.getAction())。这样spring׃(x)去自动组装这个传q来的action对象Q而action对象里的属性和spring里的bean id同名。所以spring׃(x)自动application.xml里对应的bean注射到action的属性里去,从而达到把action按用户希望的方式l装h的目的?BR><BR>如:(x)<BR>appliaction.xml<BR></FONT> <DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><FONT size=2><IMG src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">    </SPAN><SPAN style="COLOR: #0000ff"><</SPAN><SPAN style="COLOR: #800000">bean </SPAN><SPAN style="COLOR: #ff0000">id</SPAN><SPAN style="COLOR: #0000ff">="myService"</SPAN><SPAN style="COLOR: #0000ff">></SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=2><IMG src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align=top>        </FONT></SPAN><FONT size=2><SPAN style="COLOR: #0000ff"><</SPAN><SPAN style="COLOR: #800000">property </SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="target"</SPAN><SPAN style="COLOR: #0000ff">></SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=2><IMG src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align=top>            </FONT></SPAN><FONT size=2><SPAN style="COLOR: #0000ff"><</SPAN><SPAN style="COLOR: #800000">bean </SPAN><SPAN style="COLOR: #ff0000">class</SPAN><SPAN style="COLOR: #0000ff">="myServiceDefaultImpl"</SPAN><SPAN style="COLOR: #ff0000"> autowire</SPAN><SPAN style="COLOR: #0000ff">="byName"</SPAN><SPAN style="COLOR: #0000ff">></SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=2><IMG src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align=top>          </FONT></SPAN><FONT size=2><SPAN style="COLOR: #0000ff"></</SPAN><SPAN style="COLOR: #800000">property</SPAN><SPAN style="COLOR: #0000ff">></SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=2><IMG src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align=top>    </FONT></SPAN><FONT size=2><SPAN style="COLOR: #0000ff"></</SPAN><SPAN style="COLOR: #800000">bean</SPAN><SPAN style="COLOR: #0000ff">></SPAN></FONT></DIV><BR><FONT size=2>xwork.xml<BR></FONT> <DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><FONT size=2><IMG src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">        </SPAN><SPAN style="COLOR: #0000ff"><</SPAN><SPAN style="COLOR: #800000">action </SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="myAction"</SPAN><SPAN style="COLOR: #ff0000"> class</SPAN><SPAN style="COLOR: #0000ff">="myAction"</SPAN><SPAN style="COLOR: #0000ff">></SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=2><IMG src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align=top>            </FONT></SPAN><FONT size=2><SPAN style="COLOR: #0000ff"><</SPAN><SPAN style="COLOR: #800000">result </SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="success"</SPAN><SPAN style="COLOR: #0000ff">></SPAN><SPAN style="COLOR: #000000">/success.ftl</SPAN><SPAN style="COLOR: #0000ff"></</SPAN><SPAN style="COLOR: #800000">result</SPAN><SPAN style="COLOR: #0000ff">></SPAN></FONT><SPAN style="COLOR: #000000"><BR><FONT size=2><IMG src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align=top>        </FONT></SPAN><FONT size=2><SPAN style="COLOR: #0000ff"></</SPAN><SPAN style="COLOR: #800000">action</SPAN><SPAN style="COLOR: #0000ff">></SPAN></FONT></DIV><BR><FONT size=2>Action:<BR></FONT> <DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><FONT size=2><IMG src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align=top></FONT><SPAN style="COLOR: #000000"><FONT size=2>public class myAction extends ActionSupport {<BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align=top>    protected myService;<BR>         .......<BR><BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align=top>    }<BR><IMG src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align=top></FONT></SPAN></DIV><BR><FONT size=2>最后记得要在web.xml配上listener-class</FONT><img src ="http://m.tkk7.com/lilan1983/aggbug/21119.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/lilan1983/" target="_blank">李岚</a> 2005-11-23 13:52 <a href="http://m.tkk7.com/lilan1983/archive/2005/11/23/21119.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GDB使用指南http://m.tkk7.com/lilan1983/archive/2005/08/03/9133.html李岚李岚Wed, 03 Aug 2005 07:51:00 GMThttp://m.tkk7.com/lilan1983/archive/2005/08/03/9133.htmlhttp://m.tkk7.com/lilan1983/comments/9133.htmlhttp://m.tkk7.com/lilan1983/archive/2005/08/03/9133.html#Feedback0http://m.tkk7.com/lilan1983/comments/commentRss/9133.htmlhttp://m.tkk7.com/lilan1983/services/trackbacks/9133.htmlGDB使用指南 [ZZ]
 
使用GDB:
本文描述GDB,GNU的原代码调试器?q是4.12?994q一月,GDB版本4?6)

 

目录Q?
* 摘要Q?GDB的摘?
* 实例Q?一个用实?
* 入门Q?q入和退出GDB
* 命o(h)Q?GDB 的命?
* q行Q?在GDB下运行程?
* 停止Q?暂停和l执?
* 栈:(x) 查堆?
* 原文Ӟ(x) 查原文g
* 数据Q?查数?
* 语言Q?用不同的语言来用GDB
* W号Q?查符可
* 更改Q?更改执行
* GDB的文?文g
* 对象 指定调试对象
* 控制GDB 控制
* 执行序列Q?执行一序列命o(h)
* Emacs: 使GDB和Emacs一起工?
* GDB的bug:
* 命o(h)行编辑:(x) 行编?
* 使用历史记录交互Q?
* 格式化文档:(x) 如何格式化和打印GDB文档
* 安装GDB Q?

* 索引Q?

GDB介:(x)
**************

调试?比如象GDB)能让你观察另一个程序在执行时的内部zdQ或E序出错?
发生了什么?
GDB主要能ؓ(f)你做四g?包括Z完成q些事而附加的功能)Q帮助你扑ևE序
中的错误?
* q行你的E序Q设|所有的能媄响程序运行的东西?

* 保证你的E序在指定的条g下停止?

* 当你E序停止Ӟ让你查发生了什么?

* 改变你的E序。那样你可以试着修正某个bug引v的问题,然后l箋查找另一
个bug.

你可以用GDB来调试C和C++写的E序?参?*C 和C++)

部分支持Modula-2和chillQ但现在q没有这斚w的文档?

调试PascalE序Ӟ有一些功能还不能使用?

GDBq可以用来调试FORTRANE序Q尽现在还不支持表辑ּ的输入,输出变量Q?
或类FORTRAN的词法?
* GDB?free software"Q大安可以免费拯。也可以为GDB增加新的功能Q不
q可要遵守GNU的许可协议ُ。反正我认ؓ(f)GNUq是比较不错的:(x)-)
p句话Q?
Fundamentally, the General Public License is a license which says
that you have these freedoms and that you cannot take these freedoms
away from anyone else.
GDB的作者:(x)
Richard Stallman是GDB的始作俑?另外q有许多别的GNU的成员。许多h
为此作出了A(ch)献?都是老外不提也ŞQ但愿他们不要来找我ȝQ?))

 

q里是GDB的一个例子:(x)
原文中是使用一个叫m4的程序。但很遗憾我找不到这个程序的原代码,
所以没有办法来按照原文来说明。不q反正是个例子,我就拿一个操作系l的
q程调度原码来说明把Q原代码我会(x)附在后面?
首先q个E序叫os.c是一个模拟进E调度的原程?也许是个老古董了Q?))?/FONT>

先说明一下如何取得包括原代码W号的可执行代码。大家有心的话可以去看一下gcc?

man文g(在shell下打man gcc)。gcc -g <原文?c> -o <要生成的文g?gt;
-g 的意思是生成带原代码调试W号的可执行文g?
-o 的意思是指定可执行文件名?
(gcc 的命令行参数有一大堆Q有兴趣可以自己ȝ看?
(忍不住要加个注,现在应该用gcc -ggdb指定吧!因ؓ(f)有很多h都在问,因ؓ(f)除了gdb
q有别的工具:-)
反正在linux下把os.c用以上方法编译连接以后就产生了可供gdb使用的可执行文g?
我用gcc -g os.c -o osQ生的可执行文档叫os.
然后打gdb os,可q入gdbQ屏q提C:(x)
GDB is free software and you are welcome to distribute copies
of it under certain conditions; type "show copying" to see
the conditions.
There is absolutely no warranty for GDB; type "show warranty"
for details.

GDB 4.16, Copyright 1995 Free Software Foundation, Inc...
(gdb)
(gdb)是提C符Q在q提C符下可以输入命令,直到退出?退出命令是q/Q)
Z量和原文档说明的命令相W,即在本例子中没用的命o(h)我也演C?
首先我们可以讄gdb的屏q大。键入:(x)
(gdb)set width 70
是把标准屏q设?0列?
然后让我们来讄断点。设|方法很?break或简单打b后面加行h函数?
比如我们可以在main 函数上设断点Q?
(gdb)break main
?gdb)b main
pȝ提示QBreakpoint 1 at 0x8049552: file os.c, line 455.
然后我们可以q行q个E序Q当E序q行到main函数时程序就?x)停止返回到gdb?
提示W下。运行的命o(h)是run或r(gdb中有不少alias,可以看一下help,在gdb下打help)

run 后面可以跟参敎ͼ是为程序指定命令行参数?
比如r abcdQ则E序׃(x)abcd以作为参数?q里要说明的是可以用set args来指定参

?。打入r或run后,E序开始运行直到进入main的入口停止,昄Q?
Starting program: <路径>/os

Breakpoint 1, main () at os.c:455
455 Initial();
q里455 Initial();是将要执行的命o(h)或函数?
gdb提供两种方式Q?.单步q入,step into是跟踪到函数内啦。命令是step或s
2.单步QnextQ就是简单的单步Q不?x)进入函数。命令是next或n
q两个命令还有别的用法以后再说?
我们用n命o(h)Q键?
(gdb)n
Success forking process# 1 ,pid is 31474

Success forking process# 2 ,pid is 31475

Success forking process# 3 ,pid is 31476

Success forking process# 4 ,pid is 31477

Success forking process# 5 ,pid is 31478

Success forking process# 6 ,pid is 31479

Dispatching Algorithm : FIFO
********************************************************************************


PCB# PID Priority PC State
1 31474 24 0 WAITING
2 31475 19 0 WAITING
3 31476 16 0 WAITING
4 31477 23 0 WAITING
5 31478 22 0 WAITING
6 31479 20 0 WAITING

******************************************************************************


CPU : NO process running
IO : No process
Waiting CPU!!! 31474 31475 31476 31477 31478 31479
Waiting IO NONE
456 State=WAITING;
最后的一行就是下一句要执行的命令。我们现在在另一个函C加断炏V注意我?
可以用l/list命o(h)来显C原代码。这里我们键?
(gdb)l
451 main()
452 {
453 int message;
454
455 Initial();
456 State=WAITING;
457 printf("Use Control-C to halt \n");
458 signal(SIGALRM,AlarmMessage);
459 signal(SIGINT,InteruptMessage);
460 signal(SIGUSR2,IoMessage);
(gdb) l
461 alarm(TimeSlot);
462 for(;;)
463 {
464 message=GetMessage();
465 switch(message)
466 {
467 case INTERRUPT : printf("Use
Control-C t;

468 break;
469 case CHILD_IO: WaitingIo();
470 break;
昄了原代码Q现在在AlarmMessage上加断点?
(gdb) b AlarmMessage
Breakpoint 2 at 0x8048ee3: file os.c, line 259.
(gdb)
然后我们l箋q行E序?
(gdb)c
c或continue命o(h)让我们l被中断的程序?昄Q?
Continuing.
Use Control-C to halt

Breakpoint 2, AlarmMessage () at os.c:259
259 ClearSignal();
注意我们下一句语句就是ClearSignal();
我们用s/step跟踪q入q个函数看看它是q什么的?
(gdb) s
ClearSignal () at os.c:227
227 signal(SIGINT,SIG_IGN);
用l命o(h)列出原代码:(x)
(gdb) l
222 }
223
224
225 void ClearSignal() /* Clear other signals */
226 {
227 signal(SIGINT,SIG_IGN);
228 signal(SIGALRM,SIG_IGN);
229 signal(SIGUSR2,SIG_IGN);
230 }
231
(gdb)
我们可以用s命o(h)l箋跟踪。现在让我们来试试bt或backtrace命o(h)。这个命令可?
昄栈中的内宏V?
(gdb) bt
#0 ClearSignal () at os.c:227
#1 0x8048ee8 in AlarmMessage () at os.c:259
#2 0xbffffaec in ?? ()
#3 0x80486ae in ___crt_dummy__ ()
(gdb)
大家一定能看懂昄的意思。栈是AlarmMessageQ接下来的函数没有名?-是
没有原代码符受这昄了函数调用的嵌套?
好了Q我们跟t了半天q没有检查过变量的值呢。检查表辑ּ的值的命o(h)是p或print
格式是p <表达?gt;
444444让我们来找一个变量来看看。:(x)-)
(gdb)l 1
q记得l的作用吗Ql或list昄原代码符Pl或list?lt;行号>显CZ<行号>开始的

原代码。好了找C个让我们来看看WaitingQueue的内?
(gdb) p WaitingQueue
= {1, 2, 3, 4, 5, 6, 0}
(gdb)
WaitingQueue是一个数l,gdbq支持结构的昄Q?
(gdb) p Pcb
= {{Pid = 0, State = 0, Prior = 0, pc = 0}, {Pid = 31474, State = 2,
Prior = 24, pc = 0}, {Pid = 31475, State = 2, Prior = 19, pc = 0}, {
Pid = 31476, State = 2, Prior = 16, pc = 0}, {Pid = 31477, State = 2,
Prior = 23, pc = 0}, {Pid = 31478, State = 2, Prior = 22, pc = 0}, {
Pid = 31479, State = 2, Prior = 20, pc = 0}}
(gdb)
q里可以对照原程序看看?
原文档里是一个调试过E,不过我想q里我已l把gdb的常用功能介l了一遍,基本?

可以用来调试E序了。:(x)-)

q行GDB(一些详l的说明)Q?

前面已经提到q如何运行GDB了,现在让我们来看一些更有趣的东ѝ你可以在运?

GDB旉过许多命o(h)行参数指定大量的参数和选项Q通过q个你可以在一开始就讄?

E序q行的环境?
q里要描述的命令行参数覆盖了大多数的情况,事实上在一定环境下有的q没?
什么大用处。最通常的命令就是用一个参敎ͼ(x)
$gdb <可执行文档名>
你还可以同时Z的执行文件指定一个core文gQ?
$gdb <可执行文件名> core
你也可以Z要执行的文g指定一个进E号Q?
$gdb <可执行文件名> <q程?gt; 如:(x)&gdb os 1234gdb与进E?234相联p?BR>(attach)
除非你还有一个文件叫1234的。gdb首先查一个core文g?
如果你是使用一个远E终端进行远E调试的话,那如果你的终端不支持的话Q你无?/FONT>

使用W二个参数甚x有core dump。如果你觉得开头的提示信息比较眼的话Q你?BR>?
用gdb -silent。你q可以用命o(h)行参数更加详l的控制GDB的行为?
打入gdb -help?h 可以得到q方面的提示。所有的参数都被按照排列的顺序传lgdb

除非你用?x参数?
当gdb开始运行时Q它把Q何一个不带选项前缀的参数都当作Z个可执行文g?BR>core
文g(或进E号)。就象在前面加了-se?c选项。gdb把第一个前面没有选项说明的参?/FONT>

看作前面加了-se 选项Q而第二个(如果有的?看作是跟着-c选项后面的?
许多选项有羃写,用gdb -h可以看到。在gdb中你也可以Q意的把选项名掐头去,
?
要保证gdb能判断唯一的一个参数就行?
在这里我们说明一些最常用的参数选项
-symbols <文g?gt;(-s <文g?gt;)------?lt;文g?gt;中读ȝ受?
-exec <文g?gt;(-e <文g?gt;)----在合适的时候执?lt;文g?gt;来做用正的数据?BR>core
dump的作比较?
-se <文g?gt;------?lt;文g?gt;中读取符号ƈ把它作ؓ(f)可执行文件?
-core <文g?gt;(-c <文g?gt;)--指定<文g?gt;Z个core dump 文g?
-c <数字>----q接到进E号?lt;数字>Q与attach命o(h)怼?
-command <文g?gt;
-x <文g?gt;-----执行gdb命o(h)Q在<文g?gt;指定的文件中存放着一序列的gdb命o(h)Q就

象一个批处理?
-directory(-d) <路径>---指定路径。把<路径>加入到搜索原文g的\径中?
-m
-mapped----
注意q个命o(h)不是在所有的pȝ上都能用。如果你可以通过mmappȝ调用来获得内
?
映象文gQ你可以用这个命令来使gdb把你当前文g里的W号写入一个文件中Q这个文
?
存攑֜你的当前路径中。如果你调试的程序叫/temp/fred那么map文g叫
./fred.symsq样当你以后再调试这个程序时Qgdb?x)认识到q个文g的存在,从而从q?/FONT>

个文件中dW号Q而不是从可执行文件中d?syms与主机有关不能共享?
-r
-readnow---马上从符h件中d整个W号表,而不是用缺省的。缺省的W号表是

调入一部分W号Q当需要时再读入一部分。这?x)开始进入gdb慢一些,但可以加快以
?
的调试速度?

-m?r一般在一起用来建立.syms文g


接下来再谈谈模式的设|?请听下回分解 :-))
附:(x)在gdb文档里用的调试例子我找C在minix下有q个E序,叫m4有兴的
可以自己ȝ?

 

模式的选择
--------------
现在我们来聊聊gdbq行模式的选择。我们可以用许多模式来运行gdbQ例如在“批模式
?
或“安静模式”。这些模式都是在gdbq行时在命o(h)行作为选项指定的?
`-nx'
`-n'
不执行Q何初始化文g中的命o(h)?一般初始化文g叫做`.gdbinit').一般情况下
?
q些文g中的命o(h)?x)在所有的命o(h)行参数都被传lgdb后执行?

`-quiet'
`-q'
“安静模式”。不输出介绍和版权信息。这些信息在“批模式”中也被跌?

`-batch'
“批模式”。在“批模式”下q行。当在命令文件中的所有命令都被成功的执行
?
gdbq回状态?”,如果在执行过E中出错Qgdbq回一个非零倹{?
“批模式”在把gdb作ؓ(f)一个过滤器q行时很有用。比如在一台远E计机上下?BR>?
执行一个程序。信息?Program exited normally?一般是当运行的E序正常l?BR>?
时出?不会(x)在这U模式中出现?
`-cd DIRECTORY'
把DIRECTORY作ؓ(f)gdb的工作目录,而非当前目录(一般gdb~省把当前目录作为工
作目
??
`-fullname'
`-f'
GNU Emacs 讄q个选项Q当我们在Emacs下,把gdb作ؓ(f)它的一个子q程来运?BR>Ӟ
Emacs告诉gdb按标准输出完整的文g名和行号Q一个可视的栈内宏V这个格式跟
?
文g名的后面。行号和字符重新按列排,Emacs-to-GDB界面使用2字符作ؓ(f)一?
昄一原文g的信受?
`-b BPS'
E调试设|L特率?

`-tty DEVICE'
使用DEVICE来作ZE序的标准输入输?

 

`quit'
使用'quit'命o(h)来退出gdb,或打一个文件结束符(通常? CTROL-D')。如?
你没有用表辑ּQgdb?x)正帔R出,否则它会(x)把表辑ּ的至作ؓ(f)error code
q回?

一个中?通常?CTROL-c)不会(x)D从gdb中退出,而是l束M一个gdb的命
令,q回gdb的命令输入模式。一般在M时候?CTROL-C'是安全的Q因?
gdb?x)截获它Q只有当安全Ӟ中断才会(x)起作用?
如果你正在用gdb控制一个被q接的进E或讑֤Q你可以?detach'命o(h)来释?
它?

Shell命o(h)
==============
当你偶尔要运行一些shell命o(h)Ӟ你不必退试过E,也不需要挂起它Q你
可以使用'shell'命o(h)?

`shell COMMAND STRING'
调用标准shell来执?COMMAND STRING'.环境变量'SHELL'军_了那个shell?
q行。否则gdb使用'/bin/sh'.
'make'工具l常在开发环境中使用Q所以你可以不用'shell'命o(h)而直接打
'make'

`make MAKE-ARGS'
用指定的命o(h)行变量来q行'make'E序Q这{于使用'shell make MAKE-ARGS'
GDB 命o(h)
************
我们可以把一个gdb命o(h)~写成开头几个字母,如果q没有二意性你可以直接回R?/FONT>

q行。你q可以用TAB键让gdbl你完成接下来的键入Q或向你昄可选择的命?BR>Q?
如果有不止一个选择的话?

Command语法
==============

一个gdb命o(h)是一个单行的输入。长度没有限制。它一个命令开_(d)后面可以跟参
量?
比如命o(h)'step'接受一个参量表C单步执行多步。你也可以不用参量。有的命?

不接受Q何参量?

gdb命o(h)只要没有二意性的话就可以被羃写。另外一些羃写作Z个命令列出。在?BR>?
情况下二意也是允许的。比?s'是指?step'的羃写,但还有命?start'。你?BR>以把
q些~写作ؓ(f)'help'命o(h)的参量来试它们?
I(直接回R)表示重复上一个命令。但有些命o(h)不能重复比如?run'Q就不会(x)?BR>q?
U方式重复,另外一些当不小心重复会(x)产生严重后果的命令也不能用这U方法重
复?
'list'?x'命o(h)当你单的打回车时Q会(x)建立新的变量Q而不是简单的重复上一?BR>?
令。这样你可以方便的浏览原代码和内存?
gdbq有一U解释RET的方法:(x)分割长输出。这U方法就?more'命o(h)怼。由于这
时经
怼(x)不小心多打回车,gdb禁止重复当一个命令生很长的输出时?
M?#'开头一直到行尾的命令行被看作是注释。主要在命o(h)文g中用?

输入命o(h)的技?
==================
前面已经提到qTAB键的使用。用TAB键能让你方便的得到所要的命o(h)。比?
在gdb中:(x)
(gdb)info bre <TAB>(键入info bre,后按TAB?
gdb能ؓ(f)你完成剩下的输入。它q能萎蔫提供选择的可能性。如果有两个以上?
能的话,W一ơ按<TAB>键,gdb?x)响铃提C,W二ơ则昄可能的选择。同样gdb
也可以ؓ(f)一些子命o(h)提供快速的讉K。用法与上相同?
上例中显C?
(gdb)info breakepoints
你也可以直接打回车,gdb将你输入的作ؓ(f)命o(h)的可能的~写。来判断执行?
如果你打入的~写不以判断,那么gdb?x)显CZ个列表,列出可能的命令。同L(fng)
情况对于命o(h)的参数。在昄完后gdb把你的输入拷贝到当前行以便让你l输入?
如果你只想看看命令的列表或选项Q你可以在命令行下打M-?(是按着ESC?
同时按SHIFT和??。你可以直接在命令行下打试试?
(gdb)<M-?>
gdb?x)响铃ƈ昄所有的命o(h)。不q这U方式好象在q程调试是不行。当有的命o(h)
使用一个字W串Ӟ你可以用" ' "其括v来。这U方法在调试C++E序时特别有用?/FONT>

因ؓ(f)C++支持函数的重载。当你要在某个有重蝲函数上设断点Ӟ不得不给出函数参?

以区分不同的重蝲函数。这时你应该把整个函数? ' "括v来。比?你要在一?
叫name的函C设断点,而这个函数被重蝲?name(int)和name(float))。你不?
不给出参变量以区分不同的函数。?name(int)'?name(float)'。这里有个技巧,

你可以在函数名前加一? ' "W号。然后打M-?.

你可以用help命o(h)来得到gdb的在U帮助?

`help'
`h'
你可以用help或h后面不加M参数来得C个gdb命o(h)cȝ列表?

(gdb) help
List of classes of commands:

running -- Running the program
stack -- Examining the stack
data -- Examining data
breakpoints -- Making program stop at certain points
files -- Specifying and examining files
status -- Status inquiries
support -- Support facilities
user-defined -- User-defined commands
aliases -- Aliases of other commands
obscure -- Obscure features

Type "help" followed by a class name for a list of
commands in that class.
Type "help" followed by command name for full
documentation.
Command name abbreviations are allowed if unambiguous.
(gdb)

`help CLASS'
使用上面列出的help class作ؓ(f)help或h的参量,你可以得到单一的命令列表?
例如昄一?status'cȝ列表?

(gdb) help status
Status inquiries.

List of commands:

show -- Generic command for showing things set
with "set"
info -- Generic command for printing status

Type "help" followed by command name for full
documentation.
Command name abbreviations are allowed if unambiguous.
(gdb)

`help COMMAND'
详细列出单个命o(h)的资料?

`complete ARGS'
列出所有以ARGS开头的命o(h)。例如:(x)

complete i

results in:

info
inspect
ignore

This is intended for use by GNU Emacs.

除了使用'help'你还可以使用gdb的命?info'?show'来查询你E序?
状态,每个命o(h)可以查询一pd的状态。这些命令以恰当的方式显C所有的
子命令?

`info'
此命?可以~写?i')用来昄你程序的状态。比如,你可以用info
args 列出你程序所接受的命令行参数。用info registers列出寄存器的状态?
或用info breakpoint列出在程序中讄断点。要获得详细的关于info的信息打
help info.
`set'
q个命o(h)用来Z的程序设|一个运行环?使用一个表辑ּ)。比如你
可以用set prompt $来把gdb的提C符设ؓ(f)$.

`show'
?info'相反Q?show'命o(h)用来昄gdb自n的状态。你使用'set'命o(h)?
可以改变l大多数?show'昄的信息。比如用show radix命o(h)来显C基数?
用不带Q何参变量?set'命o(h)你可以显C所有你可以讄的变量的倹{?
有三个变量是不可以用'set'命o(h)来设|的?
`show version'
昄gdb的版本号。如果你发现gdb有bug的话你应该在bug-reports里加
入gdb的版本号?

`show copying'
昄版权信息?

`show warranty'
昄担保信息?
在gdb下运行你的程?
**************************
当你在gdb下运行程序时Q你必须先ؓ(f)gdb准备好带有调试信息的可执行文档?
q可以在gdb中ؓ(f)你的E序讄参变量,重定向你E序的输?输出Q设|环境变
量,调试一个已l执行的E序或kill掉一个子q程?
q里许多内容在早先的例子中都已经用到q,可以参见gdb(??
目录Q?

* ~译:: 试编译带调试信息的代?
* q行:: q行你的E序
* 参变?: Z的程序设|参变量
* q行环境:: Z的程序设|运行时环境
* 讄工作目录:: 在gdb中设|程序的工作目录?
* 输入/输出:: 讑֮你程序的输入和输?
* q接:: 调试一个已l运行的E序
* l束子进E?: Kill子进E?
* q程信息:: 附加的进E信?
* U程:: 调试带多U程的程?
* 多进E?: 调试带多q程的程?
试准备带调试信息的代?
===========================
Z高效的调试一个程序,你需要用编译器来生附带调试信息的可执行代?
q些调试信息存储在目标文件中Q描qC变量数据cd和函数声明,在原文g代码?
和执行代码之间徏立联pR?
Z生调试信息,当你使用~译器时指定'-g'选项Q就可以Z的程序生带?
调试信息的可执行代码?
有些c~译器不支持'-g'选项?-O'选项Q那你就有麻烦了Q或者有别的Ҏ(gu)产生
带调试信息的可执行代码,要不没办法了?
gccQGNU的c语言~译器支?-g'?-O'选项。这样你可以生带调试信息的且
优化q的可执行代?
当你使用gdb来调试一个?-g','-O'选项产生的程序时Q千万记住编译器Z?

化你的程序重新安排了你的E序。不要ؓ(f)q行ơ序与你原来设想的不同,最单的例子

是当你定义了一个变量但从未使用q它Ӟgdb中是看不到这个变量的--因ؓ(f)它已l?

被优化掉了?
所以有时你不要使用'-O'选项Q如果当你不用优化时产生的程序是正确的,而优?

q后变的不正了Q那么这是编译器的bug你可以向开发者提供bug-reports(包括出错

的例??
早期的GUN C语言~译器允?-gg'选项Q也用来产生调试信息Qgdb不再支持q种?/FONT>

式的调试信息Q如果你的编译器支持'-gg'选项Q请不要使用它?

`run'
`r'
使用'run'命o(h)在gdb下启动你的程序。你必须先指定你E序的名?用gdb的命?BR>?
参数)或?file'命o(h)Q来指定文g名。如果你在一个支持多q程的环境下q行你的
E?
?run'命o(h)创徏一个子q程然后加蝲你的E序。如果环境不支持q程Q则gdb直接调到

E序的第一条命令?
一些父q程讄的参量可以决定程序的q行。gdb提供了指定参量的途径Q但你必?/FONT>

在程序执行前讄好他们。你也可以在q行q程中改变它们,但每ơ改变只有在下一?/FONT>

q行中才?x)体现出来。这些参量可以分为四c:(x)
---参数
你可以在使用'run'命o(h)时设|,如果shell支持的话Q你q可以用通配W,?

变量代换。在UNIXpȝ中你可以使用'shell环境变量'来控制shell?
---环境Q?
你的E序一般直接从gdb那里l承环境变量。但是你可以使用'set environment'

命o(h)来设|专门的环境变量?
---工作目录
你的E序q同时从gdb那里l承了工作目?你可以?cd'命o(h)在gdb中改变工?/FONT>

目录?
---标准输入/输出
你的E序一般用与gdb所用的怼的设备来输入/输出。不q你可以Z的程?BR>?
输入/输出q行重定向。?run'?tty'命o(h)来设|于gdb所用不同的讑֤?
*注意Q当你用输?输出重定向时Q你不能用无名管道来把你所调试的程序的?BR>?
传给另一个程序。这样gdb?x)认试程序出错?
当你发出'run'命o(h)后,你的E序开始运行?
如果你的W号文g的时间与gdb上一ơ读入的不同Qgdb?x)废弃原来的W号表ƈ重新
?
入。当前的断点不变?

 

E序环境
==========================
“环境”包括了一pd的环境变量和它们的倹{环境变量一般记录了一些常用的?BR>息,
比如你的用户名,ȝ录,你的l端型号和你的运行程序的搜烦路径。一般你可以?BR>shell
下设|环境变量,然后q些变量被所有你所q行的程序所׃n。在调试中,可以讄?BR>?
的环境变量而不用退出gdb.

`path DIRECTORY'
?PATH'环境变量前加入新的内?'PATH'提供了搜索执行文件的路径)。对于gdb
?
你的E序来说你也许要讄一些专门的路径。?:'或空格来分隔。如果DIRECTORY?BR>l?
在\径中了,q个操作会(x)把它Ud前面?
你可以用串'$cmd'来代表当前\径,如果你用'.'的话Q它代表你?path'?BR>?
时的路径,gdb在把DIRECTORY加入搜烦路径前用'.'代替当前路径

`show paths'
昄当前路径变量的设|情c?

`show environment [VARNAME]'
昄某个环境变量的倹{如果你不指明变量名Q则gdb?x)显C所有的变量名和它们
?
内容。environment可以被羃写成'env'

`set environment VARNAME [=] VALUE'
讄某个环境变量的倹{不q只对你所调试的程序有效。对gdb本n是不起作?BR>的?
值可以是M丌Ӏ如果未指定|则该变量值将被设为NULL.
看一个例子:(x)
set env USER = foo
告诉一个linuxE序Q当它下一ơ运行是用户名将?foo'

`unset environment VARNAME'
删除某环境变量?

注意Qgdb使用'shell'环境变量所指定的shell来运行你的程序?

 

工作路径
================================
当你每次?run'命o(h)来运行你的程序时Q你的程序将l承gdb?
当前工作目录。而gdb的工作目录是从它的父q程l承而来?一般是
shell)。但你可以自׃?cd'命o(h)指定工作目录?
gdb的工作目录就是它d找某些文件或信息的途径?
`cd DIRECTORY'
把gdb的工作目录设为DIRECTORY
`pwd'
打印输出当前目录?
你程序的输入/输出
===============================
~省Ӟ你的E序的输?输出和gdb的输?输出使用同一个终端?
gdb在它自己和你的程序之间切换来和你交互Q但q会(x)引v混ؕ?
`info terminal'
昄你当前所使用的终端的cd信息?
你可以把你程序的输入/输出重定向?
例如Q?
run > outfile
q行你的E序q把你程序的标准输出写入文goutfile中?
另一个ؓ(f)你程序指定输?输出的方法是使用'tty'命o(h)Q这个命?
接受一个文件名作ؓ(f)参量把这个文件作Z后?run'命o(h)的缺省命
令文件。它q重Cؓ(f)子进E设|控制终端?
例如Q?
tty /dev/ttyb
指定以后?run'命o(h)启动的进E用终?/dev/ttyb'作ؓ(f)E序的输?
/输出Q而且把这个终端设Zq程的控制终端?
一个清楚的使用'run'命o(h)的重定向重新设|?tty'所讄的内?
Q但不媄响控制终端?当你使用'tty'命o(h)或在'run'命o(h)中对输入
/输出q行重定向时Q只有你当前调试的程序的输入/输出被改变了Q?
q不?x)媄响到别的E序?
调试一个已l运行的E序Q?
====================================

`attach PROCESS-ID'
q个命o(h)把一个已l运行的q程(在gdb外启?q接入gdb,以便
调试。PROCESS-ID是进E号?UNIX中?ps'?jobs -l'来查看进E?
'attach'一般不重复?当你打了一个以上的回R?
当然要?attach'命o(h)的话Q你的操作系l环境必L持进E?
另外你还要有向此q程发信L(fng)权力?
当?attach'命o(h)Ӟ你应该先使用'file'命o(h)来指定进E所
联系的程序源代码和符可?当gdb接到'attach'命o(h)后第一?
事就是停止进E的q行Q你可以使用所有gdb的命令来调试一个“连接?
的进E,p你用'run'命o(h)在gdb中启动它一栗如果你要进El运
行,使用'continue'?c'命o(h)p了?
`detach'
当你l束调试后可以用此命o(h)来断开q程和gdb的连接?解除gdb
对它的控?在这个命令执行后q程l执行?
如果你在?attach'q接一个进E后退ZgdbQ或使用'run'命o(h)?
行了另一个进E,q个?attach'的进E将被kill掉。但~省Ӟgdb?
要求你确认你是否要退出或执行一个新的进E?

 

l束子进E?
=========================
`kill'
Kill命o(h)l束你程序在gdb下开的子q程
q个命o(h)当你惌调试(?一个core dump文g时更有用。gdb在调试过E中
?x)忽略所有的core dump?
在一些操作系l上Q一个程序当你在上面加了断点以后׃能离开gdb独立q行?
你可以用kill命o(h)来解册个问题?
'kill'命o(h)当你想重新编译和q接你的E序时也很有用。因为有些系l不允许修改

正在执行的可执行E序。这样当你再一ơ?run'命o(h)时gdb?x)知道你的程序已l被?/FONT>

变了Q那么gdb?x)重新l(f)oad新的W号?而且量保持你当前的断点讄?
附加的进E信?
==============================
一些操作系l提供了一个设备目录叫?/proc'的,供检查进E映象。如果gdb被在
q?
L(fng)操作pȝ下运行,你可以用命?info proc'来查询进E的信息?'info proc'
?
令只在支?procfs'的SVR4pȝ上有用?
`info proc'
昄q程的概要信息?
`info proc mappings'
报告你进E所能访问的地址范围?
`info proc times'
你进E和子进E的开始时_(d)用户旉(user CPU time),和系lCPU旉?
`info proc id'
报告有关q程id的信息?
`info proc status'
报告你进E的一般状态信息。如果进E停止了。这个报告还包括停止的原因和?BR>到的
信号?
`info proc all'
昄上面q些命o(h)q回的所有信息?
对多U程E序的调?
========================================
一些操作系l中Q一个单独的E序可以有一个以上的U程在运行。线E和q程_
的定?
?

?
?
有自q寄存器,q行时堆栈或许还?x)有U有内存?
gdb提供了以下供调试多线E的q程的功能:(x)
* 自动通告新线E?
* 'thread THREADNO'Q一个用来在U程之间切换的命令?
* 'info threads'Q一个用来查询现存线E的命o(h)?
* 'thread apply [THREADNO] [ALL] ARGS',一个用来向U程提供命o(h)的命令?
* U程有关的断点设|?
注意Q这些特性不是在所有gdb版本都能使用Q归根结底要看操作系l是否支持?
如果你的gdb不支持这些命令,?x)显C出错信息:(x)
(gdb) info threads
(gdb) thread 1
Thread ID 1 not known. Use the "info threads" command to
see the IDs of currently known threads.
gdb的线E调试功能允许你观察你E序q行中所有的U程Q但无论什么时?
gdb控制QL一个“当前”线E。调试命令对“当前”进Ev作用?
一旦gdb发现了你E序中的一个新的线E,它会(x)自动昄有关此线E的pȝ?
息。比如:(x)
[New process 35 thread 27]
不过格式和操作系l有兟?
Z调试的目的,gdb自己讄U程受?
`info threads'
昄q程中所有的U程的概要信息。gdb按顺序显C:(x)
1.U程?gdb讄)
2.目标pȝ的线E标识?
3.此线E的当前堆栈?
一前面?*'的线E表C是当前U程?
例如Q?
(gdb) info threads
3 process 35 thread 27 0x34e5 in sigpause ()
2 process 35 thread 23 0x34e5 in sigpause ()
* 1 process 35 thread 13 main (argc=1, argv=0x7ffffff8)
at threadtest.c:68

 

`thread THREADNO'
把线E号为THREADNO的线E设为当前线E。命令行参数THREADNO是gdb内定?
U程受你可以?info threads'命o(h)来查看gdb内设|的U程受gdb昄该线E?
的系l定义的标识号和U程对应的堆栈。比如:(x)

(gdb) thread 2
[Switching to process 35 thread 23]
0x34e5 in sigpause ()
"Switching后的内容取决于你的操作系l对U程标识的定义?

`thread apply [THREADNO] [ALL] ARGS'
此命令让你对一个以上的U程发出相同的命?ARGS",[THREADNO]的含义同上?
如果你要向你q程中的所有的U程发出命o(h)使用[ALL]选项?
无论gdb何时中断了你的程?因ؓ(f)一个断Ҏ(gu)是一个信?Q它自动选择信号?
断点发生的线Eؓ(f)当前U程。gdb用一个格式ؓ(f)'[Switching to SYSTAG]'的消?
来向你报告?
*参见Q运行和停止多线E程序?
*参见Q设|观察点

调试多进E的E序
==========================================
gdb对调试?fork'pȝ调用产生新进E的E序没有很多支持。当一个程序开?
一个新q程Ӟgdbl对父进E进行调试,子进E将不受影响的运行。如果你在子

q程可能?x)执行到的地方设了断点,那么子进E将收到'SIGTRAP'信号Q如果子q程?

有对q个信号q行处理的话那么~省的处理就是子进E终止?
然而,如果你要一定要调试子进E的话,q儿有一个不是很ȝ的折L(fng)办法。在

子进E被q行h的开头几句语句前加上一?sleep'命o(h)。这在调试过E中q不?x)?

L(fng)序中很大的麻?不过你要自己注意例外的情况ُQ?))。然后再使用'ps'命o(h)列出

新开的子q程P最后?attach'命o(h)。这样就没有问题了?
关于q一D,本h觉得实际使用上ƈ不全是这栗我在调试程中就试过Q好象不一?/FONT>

能v作用Q要看gdb的版本和你所使用的操作系l了?

 

停止和l?
***********************
调试器的基本功能是让你能够在程序运行时在终止之前在某些条g下停止下来,
?
后再l箋q行Q这L(fng)话你可以检查当你的E序出错时你的程序究竟做了些什么?
在gdb内部Q你的程序会(x)׃各种原因而暂时停止,比如一个信P一个断点,或是

׃你用?step'命o(h)。在E序停止的时候你可以检查和改变变量的|讄或去?/FONT>

断点Q然后l你E序的运行。一般当E序停下来时gdb都会(x)昄一些有关程序状态的
?
息。比如象E序停止的原因,堆栈{等。如果你要了解更详细的信息,你可以?BR>'info
program'命o(h)。另外,在Q何时候你输入q条命o(h)Qgdb都会(x)昄当前E序q行的状?BR>?
息?

`info program'
昄有关你程序状态的信息Q你的程序是在运行还是停止,是什么进E,Z?BR>?
止?

断点Q观察点和异?
========================================
断点的作用是当你E序q行到断Ҏ(gu)Q无论它在做什么都?x)被停止下来。对于每?BR>断点
你都可以讄一些更高的信息以军_断点在什么时候v作用。你可以使用'break’命
?
来在你的E序中设|断点,在前面的例子中我们已l提到过一些这个命令的使用Ҏ(gu)
了?
你可以在行上Q函CQ甚臛_切的地址上设|断炏V在含有异常处理的语a(比如
?
c++)中,你还可以在异常发生的地方讄断点?
在SunOS 4.x,SVR4和Alpha OSF/1的设|中Q你q可以在׃n库中讄断点?
观察Ҏ(gu)一U特D的断点。它们在你程序中某个表达式的值发生变化时起作用。你
?
M用另外一些命令来讄观察炏V除了这个特性以外,你可以象Ҏ(gu)通断点一样对?BR>?
点进行操?-使用和普通断Ҏ(gu)作一L(fng)命o(h)来对观察点能,使不能,删除?
你可以安排当你程序被中断时显C的E序变量?
当你在程序中讄断点或观察点时gdb为每个断Ҏ(gu)观察点赋一个数?在许多对?BR>?
操作的命令中都要使用q个数倹{?

 

讄断点
=============
使用'break'或简写成'b'来设|断炏Vgdb使用环境变量$bpnum来记录你最新设|的

断点?
你有不少Ҏ(gu)来设|断炏V?


`break FUNCTION'
此命令用来在某个函数上设|断炏V当你用允许函数重载的语言比如C++Ӟ?BR>?
能同时在几个重蝲的函C讄了断炏V?

`break +OFFSET'
`break -OFFSET'
在当前程序运行到的前几行或后几行讄断点。OFFSET受?

`break LINENUM'
在行号ؓ(f)LINENUM的行上设|断炏V程序在q行到此行之前停止?

`break FILENAME:LINENUM'
在文件名为FILENAME的原文g的第LINENUM行设|断炏V?

`break FILENAME:FUNCTION'
在文件名为FILENAME的原文g的名为FUNCTION的函C讄断点?
当你的多个文件中可能含有相同的函数名时必ȝ出文件名?

`break *ADDRESS'
在地址ADDRESS上设|断点,q个命o(h)允许你在没有调试信息的程
序中讄断点?
`break'
?break'命o(h)不包含Q何参数时Q?break'命o(h)在当前执行到的程
序运行栈中的下一条指令上讄一个断炏V除了栈底以外,q个命o(h)?
E序在一旦从当前函数q回时停止。相似的命o(h)?finish'Q但'finish'
q不讄断点。这一点在循环语句中很有用?
gdb在恢复执行时Q至执行一条指令?

`break ... if COND'
q个命o(h)讄一个条件断点,条g由COND指定Q在gdb每次执行到此
断点时COND都被计算当COND的gؓ(f)非零ӞE序在断点处停止。这意味着
COND的gؓ(f)真时E序停止?..可以Z面所说的一些参量?

`tbreak ARGS'
讄断点为只有效一ơ。ARGS的用同'break'中的参量的用?

`hbreak ARGS'
讄一个由g支持的断炏VARGS?break'命o(h)Q设|方法也?
'break'相同。但q种断点需要由g支持Q所以不是所有的pȝ上这?
命o(h)都有效。这个命令的主要目的是用于对EPROM/ROME序的调试。因?
q条命o(h)可以在不改变代码的情况下讄断点。这可以同SPARCLite DSU
一起用。当E序讉K某些变量和代码时QDSU设|“陷井”。注意:(x)
你只能一ơ用一个断点,在新讄断点Ӟ先删除原断点?
thbreak ARGS'
讄只有一ơ作用的g支持断点。ARGS用法?hbreak'命o(h)。这个命?
?tbreak'命o(h)怼Q它所讄的断点只起一ơ作用,然后p自动的删除。这
个命令所讄的断炚w要有g支持?
`rbreak REGEX'
在所有满辑ּREGEX的函C讄断点。这个命令在所有相匚w的函?
上设|无条g断点Q当q个命o(h)完成时显C所有被讄的断点信息。这个命令设
|的断点?break'命o(h)讄的没有什么不同。这样你可以象操作一般的断点一
样对q个命o(h)讄的断点进行删除,使能Q不能{操作。当调试C++E序时这
个命令在重蝲函数上设|断Ҏ(gu)非常有用?

`info breakpoints [N]'
`info break [N]'
`info watchpoints [N]'
昄所有的断点和观察点的设|表Q有下列一些列

*Breakpoint Numbers*----断点?
*Type*----断点cd(断点或是观察?
*Disposition*---昄断点的状态?

*Enabled or Disabled*---使能或不使能?y'表示使能Q?n'表示不能?

*Address*----地址Q断点在你程序中的地址(内存地址)
*What*---地址Q断点在你程序中的行受?
如果断点是条件断点,此命令还昄断点所需要的条g?
带参数N?info break'命o(h)只显C由N指定的断点的信息?
此命令还昄断点的运行信?被执行过几次)Q这个功能在使用'ignore'
命o(h)时很有用。你可以'ignore'一个断点许多次。用这个命令可以查看断?
被执行了多少ơ。这样可以更快的扑ֈ错误?
gdb允许你在一个地方设|多个断炏V但讄相同的断Ҏ(gu)疑是弱智的。不q?
你可以用条件断点,q样非常有用?
gdb有时?x)自动在你的E序中加入断炏V这主要是gdb自己的需要。比如ؓ(f)了正
的处理C语言中的'longjmp'。这些内部断炚w是负|?-1'开始?info
breakpoints'不会(x)昄它们?
不过你可以用命令’maint info breakpoints'来查看这些断炏V?

`maint info breakpoints'
使用格式?info breakpoints'相同Q显C所有的断点Q无论是你设|的q是
gdb自动讄的?
以下列的含义Q?

`breakpoint'
断点Q普通断炏V?
`watchpoint'
普通观察点?

`longjmp'
内部断点Q用于处?longjmp'调用?

`longjmp resume'
内部断点Q设|在'longjmp'调用的目标上?

`until'
'until'命o(h)所使用的内部断炏V?

`finish'
'finish'命o(h)所使用的内部断炏V?

 

讄观察?
==============
你可以用观察点来停止一个程序,当某个表辑ּ的值改变时Q观察点?x)将E序
停止。而不需要先指定在某个地方设|一个断炏V?
׃观察点的q个Ҏ(gu),使观察点的用时开销比较大,但在捕捉错误旉常有
用。特别是你不知道你的E序什么地方出了问题时?

`watch EXPR'
q个命o(h)使用EXPR作ؓ(f)表达式设|一个观察点。GDB把表达式加入到E序?
q监视程序的q行Q当表达式的D改变时GDB׃ɽE序停止。这个也可以被用?
SPARClite DSU提供的新的自陷工具中。当E序存取某个地址或某条指令时(q个?
址在调试寄存器中指?,DSU生自陗对于数据地址DSU支持'watch'命o(h),然?
g断点寄存器只能存储两个断点地址Q而且断点的类型必ȝ同。就是两?
'rwatch'型断点,或是两个'awatch'型断炏V?

`rwatch EXPR'
讄一个观察点Q当EXPR被程序读ӞE序被暂停?

`awatch EXPR'
讄一个观察点,当EXPR被读出然后被写入时程序被暂停。这个命令和'awatch'
命o(h)合用?

`info watchpoints'
昄所讄的观察点的列表,?info break'命o(h)怼?
*注意Q?在多U程的程序中Q观察点的作用很有限QGDB只能观察在一个线E中
的表辑ּ的值如果你信表达式只被当前线E所存取Q那么用观察点才有效。GDB
不能注意一个非当前U程对表辑ּ值的改变?

断点和异?
==============
在一些语a中比如象GNU C++Q实C异常处理。你可以使用GDB来检查异常发生的

原因。而且GDBq可以列出在某个点上异常处理的所有过E?

`catch EXCEPTIONS'
你可以用这个命令来在一个被Ȁzȝ异常处理句柄中设|断炏VEXCEPTIONS?

一个你要抓住的异常?
你一样可以?info catch'命o(h)来列出活跃的异常处理句柄?
现在GDB中对于异常处理由以下情况不能处理?
* 如果你用一个交互的函数Q当函数q行l束ӞGDB象普通情况一h控制q?/FONT>

回给你。如果在调用中发生了异常Q这个函数将l箋q行直到遇到一个断点,一个信?/FONT>

或是退行?
* 你不能手工生一个异? 卛_常只能由E序q行中?)
* 你不能手工设|一个异常处理句柄?
有时'catch'命o(h)不一定是调试异常处理的最好的Ҏ(gu)。如果你需要知道异生的

切位置Q最好在异常处理句柄被调用以前设|一个断点,q样你可以检查栈的内宏V?/FONT>

如果你在一个异常处理句柄上讄断点Q那么你׃Ҏ(gu)知道异常发生的位|和原因?/FONT>

要仅仅只在异常处理句柄被唤醒之前讄断点Q你必须了解一些语a的实现细节?

比如在GNU C++中异常被一个叫'__raise_exception'的库函数所调用。这个函数的?
型是Q?

/* ADDR is where the exception identifier is stored.
ID is the exception identifier. */
void __raise_exception (void **ADDR, void *ID);
要GDB在栈展开之前抓住所有的句柄Q你可以在函?__raise_exception'上设|断
炏V?
对于一个条件断点,׃它取决于ID的|你可以在你程序中讄断点Q当某个?

别的异常被唤醒。当有一pd异常被唤醒时Q你可以使用多重条g断点来停止你的程
序?

 

删除断点
===================
很自然当一个断Ҏ(gu)是一个观察点完成了它的命后Q你需要把它从E序中删厅R?

不然你的E序q会(x)在相同的地方停主Q给你造成q扰。?clear'命o(h)来从E序中删
?
一个断炏V?
使用'clear'命o(h)你可以删除指定位|的断点。?delete'命o(h)你可以用断点号

来指定要删去的断Ҏ(gu)观察炏V?
在删除断Ҏ(gu)不需要先q行q它QGDB?x)忽略你刚才删去的断炏V所以你可以l箋q?BR>?
你的E序而不必管断点?

`clear'
在当前选择的栈帧上清除下一个所要执行到的断?指o(h)U?。当你当前选择帧是
栈中
最内层时用这个命令可以很方便的删d才程序停止处的断炏V?

`clear FUNCTION'
`clear FILENAME:FUNCTION'
删除名ؓ(f)FUNCITON的函C的断炏V?

`clear LINENUM'
`clear FILENAME:LINENUM'
删除以LINENUM号上的断炏V?

`delete [breakpoints] [BNUMS...]'
删除参数所指定的断点,如果没有指定参数则删ȝ序中所有的断点。这个命?BR>可以
~写成ؓ(f)'d'

使断Ҏ(gu)时不起作用?
========================
如果你只是想让断点一时失M用以方便调试的话Q你可以先断点不v作用?
当你以后又想使用时可以用'enable'命o(h)Ȁzd们?
你?enable'命o(h)来激zLҎ(gu)是观察点Q?disable'命o(h)来断点或观察点

不v作用。?info break'?info watch'来查看那些断Ҏ(gu)z跃的?
断点或观察点有四U状态:(x)
* 使能。当E序q行到断点处ӞE序停止。?break'命o(h)讄的断点一开始缺
?
是能的?
*不能。断点对你程序的q行没有什么媄响?
*使能一ơ后变ؓ(f)不能。断点对你的E序q行只有一ơ媄响,然后p动变成不?BR>?
状态。?tbreak'讄的断点一开始缺省是q个状态?
* 使能一ơ自动删除。断点在起了一ơ作用后自动被删除?
你可以用以下的命o(h)来能或使不能一个断Ҏ(gu)观察炏V?

`disable [breakpoints] [BNUMS...]'
使由参数指定的断Ҏ(gu)观察点变Z使能Q如果没有参数的话缺省所有断点和
观察
点变Z使能。当一个断Ҏ(gu)观察点被不能后在被不能前的状态被记录下来Q在?BR>Ҏ(gu)
观察点再ơ被ȀzLQ原来的状态得到l。比如一个条件断Ҏ(gu)一个设|了
'ignore-counts'的断点在被不能后记录活跃时断点被执行的ơ数Q在不能状态下
Q断
点的执行ơ数(ignore-counts)不增加,直到断点再次被激zLQ再l箋计算条g
(ignore-counts)。你可以使用'disable'命o(h)的羃?dis'

`enable [breakpoints] [BNUMS...]'
使能由参数指定的断点或全部断炏V?

`enable [breakpoints] once BNUMS...'
功能同上条命令,只是q条命o(h)使断点只使能一ơ?

`enable [breakpoints] delete BNUMS...'
功能同上条命令,只是q条命o(h)使被使能的断点v作用一ơ然后自动被删除?
除了使用'tbreak'命o(h)所讄的断点以外,断点被设|时都是使能的?

 

断点条g
===========
最单的断点是当你的程序每ơ执行到的时候就单将E序挂v。你也可以ؓ(f)?BR>?
讄“条件”。条件只是你所使用的编E语a的一个布?yu)(dng)表辑ּQ带有条件表辑ּ的断
?
在每ơ执行时判断计算表达式的|当表辑ּgؓ(f)真时才挂L(fng)序?
q是使用“断a”的一中Ş式,在这UŞ式中你只有在断言为真时才挂vE序。如
?
在C语言中你要断言为假时挂L(fng)序则使用Q?表达式”?
条g表达式对观察点也同样有效Q但你ƈ不需要它Q因察点本np一个表
辑ּ?
?
但它也许?x)简单一些。比如只在一个变量名上设|观察点然后讄一个条件来试新的
?
倹{?
断点条g可能有副作用(side effects)?x)媄响程序的q行。这一Ҏ(gu)时也是很有用?/FONT>

比如来激zM个显C程序完成情늚的函敎ͼ或用你自己的打印函数来格式化特D的

数据l构。当在同一位置没有另一个断点设|时Q结果是可预见的?在gdb中如果在?BR>一
个地方用了一个断点和一个条件断点则普通断点可能先被激zR?在条件断点的应用
?
有很多技巧?
断点条g可以在设|断点的同时被设|。?if'命o(h)作ؓ(f)'break'命o(h)的参数。断
?
条g也可以在M时候?condition'命o(h)来设|?watch'命o(h)不能?if'作ؓ(f)参数


所以?condition'命o(h)是在观察点上讄条g的唯一Ҏ(gu)?

`condition BNUM EXPRESSION'
?EXPRESSIN'作ؓ(f)断点条g。断点用'BNUM'来指定。在你ؓ(f)BNUMh点设|了?BR>?
后,只有在条件ؓ(f)真时E序才被暂停。当你?condition'命o(h)GDB马上同步的检?
'EXPRESSION'的值判断表辑ּ中的W号在断点处是否有效Q但GDBq不真正计算表达?

的倹{?

`condition BNUM'
删除?BNUM'h点处的条件。之成Z个普通断炏V?
一个条件断点的Ҏ(gu)例子是时一个程序在执行了某句语句若q次后停止。由于这
个功能非常常用,你可以用一个命令来直接讄它那是'ignore count'。每?
断点都有'ignore count'Q缺省是零。如?ignore count'是正的那么你的程序在
q行q断点处'count'ơ后被暂停?

`ignore BNUM COUNT'
讄WBNUMh点的'ignore count'?COUNT'?
如果要让断点在下ơ执行到时就暂停E序Q那么把'COUNT'设ؓ(f)0.
当你使用'continue'命o(h)来l你E序的执行时Q你可以直接?ignore count'

作ؓ(f)'continue'的参C用。你只要直接?continue'命o(h)后直接跟?ignore"?
ơ数p?
如果一个断点同时有一个ignore count和一个条件时Q条件不被检查。只有当
'ignore count'为零时GDB才开始检查条件的真假?
另外你可以用'condition'命o(h)来获得与用‘ignore count'同样效果的断炏V用
?
是用cM?$foo--<=0'的参量作?condition'命o(h)的参?使用一个不停减量的变量

作ؓ(f)条g表达式的成员)?

 

断点命o(h)列表
==================
你可以ؓ(f)M个断Ҏ(gu)观察Ҏ(gu)定一pd命o(h)Q当你程序执行到断点ӞGDB自动?BR>?
q些命o(h)。例如:(x)你可以打C些表辑ּ的|或能其他的断点?

`commands [BNUM]'
`... COMMAND-LIST ...'
`end'
为断点号为BNUM的断点设|一个命令列表。这些命令在'...COMMAND-LIST...'?BR>?
Z?end'命o(h)来表C列表的l束?
要删除断点上讄的命令序列,你只需?command'命o(h)后直接跟'end'命o(h)可?/FONT>

了?
当不指定BNUMӞGDB~省为最q遇到的断点或是观察点设|命令列表?
使用回R来表C重复用命令的Ҏ(gu)在'...command list...'中不能用?
你可以用命令列表中的命令来再次使你的程序进入运行状态。简单的在命令列?/FONT>

中?continue'命o(h)Q或'step'命o(h)?
在ɽE序恢复执行的命令后的命令都被忽略。这是因Z旦你的程序重新运行就?/FONT>

能遇到新的命令列表,那么应该执行新的命令。防止了二义?
如果你在命o(h)列表中用了'silent'命o(h)Q那么你E序在断点处停止的信息将不被

昄。这对于用一个断点然后显CZ些信息,接着再l执行很有用。但'silent'命o(h)

只有在命令列表的开头有效?
命o(h)'echo','output'?printf'允许你精的控制昄信息Q这些命令在
"silent"
断点中很有用?
例如Q这个例子演CZ使用断点命o(h)列表来打?x'的?

break foo if x>0
commands
silent
printf "x is %d\n",x
cont
end
断点命o(h)列表的一个应用是在遇C个buf之后Ҏ(gu)数据然后l箋调试的过E?
使用命o(h)来修改含有错误值的变量Q然后?continue'命o(h)l箋E序的运行?
使用'silent'命o(h)屏蔽输出Q?

break 403
commands
silent
set x = y + 4
cont
end

 

断点菜单
==============
一些编E语a(比如象C++)允许一个函数名被多ơ?重蝲)Q以方便应用的用?/FONT>

当一个函数名被重载时Q?break FUNCITON'命o(h)向GDB提供的信息不够GDB了解你要讄

断点的确切位|。如果你了解到这个问题,你可以?break FUNCITONS(TYPES)'命o(h)

来指定断点的切位置。否则GDB?x)提供一个函数的选择的菜单供你选择。用提C符

'>'来等待你的输入。开始的两个选择一般是'[0] cancel'?[1] all'输入1则在所?

同名函数上加入断炏V输?则退出选择?
下例Z囑֜重蝲的函数符?String::after'上设|断炏V?
(gdb) b String::after
[0] cancel
[1] all
[2] file:String.cc; line number:867
[3] file:String.cc; line number:860
[4] file:String.cc; line number:875
[5] file:String. 

 



李岚 2005-08-03 15:51 发表评论
]]>
AOP,IOC,Springhttp://m.tkk7.com/lilan1983/archive/2005/06/01/5408.html李岚李岚Wed, 01 Jun 2005 06:11:00 GMThttp://m.tkk7.com/lilan1983/archive/2005/06/01/5408.htmlhttp://m.tkk7.com/lilan1983/comments/5408.htmlhttp://m.tkk7.com/lilan1983/archive/2005/06/01/5408.html#Feedback0http://m.tkk7.com/lilan1983/comments/commentRss/5408.htmlhttp://m.tkk7.com/lilan1983/services/trackbacks/5408.html理解AOP

我觉得面向对象很好地解决了Y件系l中职责划分的问?SPAN lang=EN-US>.借助于面向对?软g开发h员一般的,都可以将需求里的名词{换成pȝ中的对象,动词转换为对象里的方?q样非常W合人的思维方式,非常自然.


但是,问题是某些需求却偏偏不是能用q样的”名词”和”动词”就能完的描述出来?假如q样的问?需要对pȝ中的某些Ҏ(gu)q行事务处理,q种需要事务代码散布在多个cM.面对q种需?应该怎么办呢?最直接的办法就?创徏一个基c?接口)或者一个助?事务处理的功能攑֜其中,q让所有需要事务功能的cȝ承这个基c?接口)或者用这个助?加入q样?需要修改的地方׃(x)分散在多个文件中.q样大的修改?无疑?x)增加出错的几?q且加大pȝl护的难?如图:

                                      1.jpg




因此,面向斚w的编E?
Aspect Oriented Programming,AOP)应运而生.AOP为开发者提供了一U描q横切关注点的机?SPAN lang=EN-US>,q能够自动将横切x点织入到面向对象的Y件系l中Q从而实C横切x点的模块?通过划分Aspect代码,横切x点变得容易处?开发者可以在~译时更?插入或除ȝl的Aspect,甚至重用pȝ?/SPAN>Aspect.?OOP只用于表C对象之间的泛化-特化(generalization-specialization)关系(通过l承来表?,而对象之间的横向兌则完全用AOP来表?SPAN lang=EN-US>. q样,很多l对象之间横向关联增加灵zL的设计模式(例如Decorator{?SPAN lang=EN-US>)不再必??如图:
                                       2.jpg

Spring中的Ioc

想一想以前在使用工厂模式的时?SPAN lang=EN-US>,在最早的情况?每个工厂可能都是一?/SPAN>Singleton,生成对象的代码被写死在了c里?SPAN lang=EN-US>.后来Z觉这栯是耦合E度太高,q不够灵z?所以把对象的类名写在一?/SPAN>XML文g?SPAN lang=EN-US>,q样一?问题又来?每个工厂都有自己的读取配|文件的代码,通过dXML文g,或者通过dProperties,工厂里充满了qp的和业务逻辑完全不相关的配置理代码,l护h很不方便,.?/SPAN>Spring通过?/SPAN>lg工厂?/SPAN>把这些都集成在了一?SPAN lang=EN-US>,用一个统一?/SPAN>BeanFactory来管理这些配|?SPAN lang=EN-US>,而且提供了更高一U的抽象:ApplicationContext

 

Ioc好像很神奇的样子,其实原理和实现都很简?是要使用的对象都用XML来定?用反来生成,用注的方式来? 其实Ioc是工厂模式的升华Q?/SPAN>Ioc可以被看作是一个大工厂Q只不过q个大工厂里要生成的对象都是?/SPAN>XML文g中给出定义的Q然后利?/SPAN>Java?SPAN lang=EN-US>“反”编E,Ҏ(gu)XML中给出的cd生成相应的对象。从实现来看Q?/SPAN>Ioc是把以前在工厂方法里写死的对象生成代码,改变为由XML文g来定义,也就是把工厂和对象生成这两者独立分隔开来,目的是提高灉|性和可维护性?SPAN lang=EN-US>

Template Method和回调在框架中的使用

Template模式主要是用来解册L(fng)一个问?SPAN lang=EN-US>:当你知道法的具体步?但不知道如何L行这些步?Template把如何执行这些步骤的Ҏ(gu)都封装成抽象的函?SPAN lang=EN-US>,q且提供一个正的序L行这些步?而具体子cd现这些处理各个步骤的抽象Ҏ(gu).

 

业务逻辑抽象到超c集中化是所谓的”控制反转”了.在传l的cd?一般是由客L(fng)来调用类库里的方?而在q里,却是框架控制了用hE?具体的子cd是要求行一个明的契约.在Spring中的MVC框架?jdbc包里.都大量的使用了Template模式.

 

?SPAN lang=EN-US>Java中的回调函数主要是在实现事g驱动模型的时候用的,但是在Spring里面,回调被赋予了新的意义:通过回调接口(函数)来实现可扩展?如jdbc包的RowcallbackHandler.



李岚 2005-06-01 14:11 发表评论
]]>
C语言函数调用框架http://m.tkk7.com/lilan1983/archive/2005/05/27/5259.html李岚李岚Fri, 27 May 2005 03:44:00 GMThttp://m.tkk7.com/lilan1983/archive/2005/05/27/5259.htmlhttp://m.tkk7.com/lilan1983/comments/5259.htmlhttp://m.tkk7.com/lilan1983/archive/2005/05/27/5259.html#Feedback0http://m.tkk7.com/lilan1983/comments/commentRss/5259.htmlhttp://m.tkk7.com/lilan1983/services/trackbacks/5259.html阅读全文

李岚 2005-05-27 11:44 发表评论
]]>
对Spring MVC Framework的理?/title><link>http://m.tkk7.com/lilan1983/archive/2005/05/27/5258.html</link><dc:creator>李岚</dc:creator><author>李岚</author><pubDate>Fri, 27 May 2005 03:29:00 GMT</pubDate><guid>http://m.tkk7.com/lilan1983/archive/2005/05/27/5258.html</guid><wfw:comment>http://m.tkk7.com/lilan1983/comments/5258.html</wfw:comment><comments>http://m.tkk7.com/lilan1983/archive/2005/05/27/5258.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://m.tkk7.com/lilan1983/comments/commentRss/5258.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/lilan1983/services/trackbacks/5258.html</trackback:ping><description><![CDATA[     摘要: 前言 最q在看Spring MVC的源?把自己对MVC模式和对各种框架的实现的认识写出来给大家看看,是一个ȝ.所?恌大家用怀疑的眼光来看待这文?假如有认识不对的地方,ȝ指出. MVC与WEB应用 MVC是什么就不用我多说了.对于现有较成熟的Model-View-Control(MVC)框架而言,其注意的主要问题无外乎下面这? Model: 模型应该包含p图显C的数据...  <a href='http://m.tkk7.com/lilan1983/archive/2005/05/27/5258.html'>阅读全文</a><img src ="http://m.tkk7.com/lilan1983/aggbug/5258.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/lilan1983/" target="_blank">李岚</a> 2005-05-27 11:29 <a href="http://m.tkk7.com/lilan1983/archive/2005/05/27/5258.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://m.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://jinlaifubuxiugang.com" target="_blank">ɫ</a>| <a href="http://fanhaogo.com" target="_blank">ĻþƷƵ</a>| <a href="http://c7372.com" target="_blank">ͼͼԴۺվ</a>| <a href="http://kekead.com" target="_blank">ѾƷԲĹۿ</a>| <a href="http://yuase.com" target="_blank">þwww˳_Ƭ</a>| <a href="http://xuanzhicity.com" target="_blank">˿appַios</a>| <a href="http://zygwkqf.com" target="_blank">޷A߷</a>| <a href="http://35419470.com" target="_blank">޳ѹۿ</a>| <a href="http://dzhyyy.com" target="_blank">AVһþ</a>| <a href="http://www-070755.com" target="_blank">޹һ</a>| <a href="http://www045888.com" target="_blank">һ</a>| <a href="http://mt181.com" target="_blank">žžƷƵ</a>| <a href="http://xjtuykw.com" target="_blank">þҹҹ³³ƬӰ </a>| <a href="http://gdfcjzx.com" target="_blank">޾ƷԲ߹ۿ</a>| <a href="http://takiku.com" target="_blank">޹һ</a>| <a href="http://q2c6.com" target="_blank">þþƷһ</a>| <a href="http://yzxjk.com" target="_blank">Ļ߹ۿƵ</a>| <a href="http://ccc998.com" target="_blank">ҹAV</a>| <a href="http://wwwfac37.com" target="_blank">ѾþþƷ99þ</a>| <a href="http://by11gun.com" target="_blank">ѿڿŮ</a>| <a href="http://77tok.com" target="_blank">͵Ƶ߹ۿ</a>| <a href="http://www-2236444.com" target="_blank">պ޹ۺϸ</a>| <a href="http://0102008.com" target="_blank">Ƶ</a>| <a href="http://www4438xx2.com" target="_blank">˳߾Ʒ</a>| <a href="http://ningxialanh.com" target="_blank">ƵƷ</a>| <a href="http://dgyxcsb.com" target="_blank">޳˵Ӱ߹ۿ</a>| <a href="http://bentuxinli.com" target="_blank">պƷav</a>| <a href="http://chiguigu.com" target="_blank">ͼƬС˵</a>| <a href="http://jl910.com" target="_blank">ҹƷӰ߹ۿ</a>| <a href="http://imfever.com" target="_blank">ۺþþ</a>| <a href="http://jsky163.com" target="_blank">þþþavרˮ</a>| <a href="http://chinashineway.com" target="_blank">ŷƵ</a>| <a href="http://caicpa.com" target="_blank">þԭavapp</a>| <a href="http://m8va.com" target="_blank">һƵ</a>| <a href="http://hjndgb.com" target="_blank">Ƶһ</a>| <a href="http://jastrelax.com" target="_blank">պĻ</a>| <a href="http://66cws.com" target="_blank">˳վɫ߹ۿ</a>| <a href="http://633223.com" target="_blank">ɫ18վWWW߲</a>| <a href="http://hmjx-tape.com" target="_blank">ɫ͵͵Ůùۿŷ</a>| <a href="http://csl-chinga.com" target="_blank">޾Ʒ˾þ</a>| <a href="http://bentuxinli.com" target="_blank">߾þ֮ۺ߾þ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>