<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8">
<meta name="generator" content="pdf2htmlEX">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<link rel="stylesheet" href="https://static.pudn.com/base/css/base.min.css">
<link rel="stylesheet" href="https://static.pudn.com/base/css/fancy.min.css">
<link rel="stylesheet" href="https://static.pudn.com/prod/directory_preview_static/622b68be15da9b288b8925cf/raw.css">
<script src="https://static.pudn.com/base/js/compatibility.min.js"></script>
<script src="https://static.pudn.com/base/js/pdf2htmlEX.min.js"></script>
<script>
try{
pdf2htmlEX.defaultViewer = new pdf2htmlEX.Viewer({});
}catch(e){}
</script>
<title></title>
</head>
<body>
<div id="sidebar" style="display: none">
<div id="outline">
</div>
</div>
<div id="pf1" class="pf w0 h0" data-page-no="1"><div class="pc pc1 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/622b68be15da9b288b8925cf/bg1.jpg"><div class="t m0 x1 h2 y1 ff1 fs0 fc0 sc0 ls0 ws0">www<span class="_ _0"></span>.moandroid<span class="_ _0"></span>.com<span class="fc1 ls1 ws1"> </span></div><div class="t m0 x2 h3 y2 ff2 fs1 fc0 sc0 ls1 ws1">mo-Android <span class="ff3 ls2 ws2">感受<span class="_ _1"> </span></span>Android<span class="_ _1"> </span><span class="ff3">带给我<span class="_ _0"></span>们的新体验<span class="ff1 fc1"> </span></span></div><div class="t m0 x3 h4 y3 ff4 fs2 fc1 sc0 ls3 ws3">And<span class="_ _2"></span>r<span class="_ _0"></span>oi<span class="_ _3"></span>d<span class="_ _4"> </span><span class="ff3 sc1 ls4 ws4">程序调试</span><span class="ls1 ws1"> </span></div><div class="t m0 x4 h5 y4 ff5 fs3 fc1 sc0 ls1 ws1">•<span class="ff6"> <span class="_ _5"> </span><span class="ff1 fs1 fc0 ls5 ws5">Android<span class="_"> </span><span class="ff3 ls1 ws1">下如何调试程序?<span class="_ _6"> </span><span class="ff1 fc1"> </span></span></span></span></div><div class="t m0 x4 h5 y5 ff5 fs3 fc1 sc0 ls1 ws1">•<span class="ff6"> <span class="_ _5"> </span><span class="ff1 fs1 fc0 ls5 ws6">Android DDMS<span class="_"> </span><span class="ff3 ls2 ws2">如何使<span class="_ _3"></span>用?<span class="_ _7"> </span></span></span><span class="ff1 fs1"> </span></span></div><div class="t m0 x5 h6 y6 ff7 fs4 fc1 sc0 ls6 ws7">Andro<span class="_ _0"></span>i<span class="_ _3"></span>d<span class="_ _8"> </span><span class="ff3 sc1 ls7 ws8">下如何调试程序?</span><span class="ls1 ws1"> </span></div><div class="t m0 x3 h7 y7 ff3 fs5 fc1 sc0 ls1 ws1">写代码是每个程序员最乐意做的事,<span class="_ _9"></span>然而在开发中也会遇到很多令程序员很头疼的事情。<span class="_ _9"></span>如果说让程序员最头疼的事情是看到无数<span class="_ _a"> </span><span class="ff2">bug</span>、</div><div class="t m0 x3 h7 y8 ff3 fs5 fc1 sc0 ls1 ws1">软件的发布遥遥无<span class="ff2"> </span>期,<span class="_ _b"></span>那么让程序员最最头疼的事情是程序在调试状态下没有问题然而在实际运行中确有问题。<span class="_ _b"></span>调试程序是每个程序</div><div class="t m0 x3 h7 y9 ff3 fs5 fc1 sc0 ls1 ws1">员工作中必不可少的部分,<span class="_ _0"></span>而且可以毫不夸张地说<span class="ff2"> </span>调试程序暂用了程序员<span class="_ _c"> </span><span class="ff2">50%</span>的工作时间。<span class="_ _0"></span>由此可见,调试程序是每个程序员必不可</div><div class="t m0 x3 h7 ya ff3 fs5 fc1 sc0 ls1 ws1">少的技术,<span class="_ _2"></span>调试水平的高低决定了程序员水平的高低。<span class="_ _2"></span>在开发<span class="_ _c"> </span><span class="ff2">Android<span class="_ _c"> </span></span>程<span class="ff2"> </span>序前,<span class="_ _2"></span>有必要总结下如何调试<span class="_ _c"> </span><span class="ff2">Android<span class="_ _c"> </span></span>程序。<span class="_ _2"></span>目前就开发过</div><div class="t m0 x3 h7 yb ff3 fs5 fc1 sc0 ls1 ws1">程中,常用调试程序的方法总结如下:<span class="ff2"> </span></div><div class="t m0 x4 h8 yc ff1 fs1 fc1 sc0 ls8 ws9">1.<span class="ff6 ls1 ws1"> <span class="_ _d"> </span><span class="ff3">使用<span class="_ _1"> </span></span></span><span class="ls9 wsa">Eclipse<span class="_"> </span><span class="ff3 ls2 ws2">开发平台<span class="_ _3"></span>调试;</span><span class="ls1 ws1"> </span></span></div><div class="t m0 x4 h8 yd ff1 fs1 fc1 sc0 ls8 ws9">2.<span class="ff6 ls1 ws1"> <span class="_ _d"> </span><span class="ff3">结合<span class="_ _1"> </span></span></span><span class="ls5 ws5">Android<span class="ls1 ws1"> <span class="_ _e"> </span><span class="lsa wsb">SDK<span class="_ _1"> </span><span class="ff3 ls2 ws2">调试<span class="_ _3"></span>;</span></span> </span></span></div><div class="t m0 x4 h8 ye ff1 fs1 fc1 sc0 ls8 ws9">3.<span class="ff6 ls1 ws1"> <span class="_ _d"> </span><span class="ff3">使用<span class="_ _1"> </span></span></span><span class="lsa wsb">JUnit<span class="_ _e"> </span><span class="ff3 ls2 ws2">调试<span class="ls1 ws1">;<span class="ff1"> </span></span></span></span></div><div class="t m0 x3 h9 yf ff3 fs6 fc1 sc1 ls1 ws1">使用<span class="_ _c"> </span><span class="ff2 lsb wsc">Eclipse<span class="_ _f"> </span></span>开发平台调试<span class="ff2"> </span></div><div class="t m0 x3 h7 y10 ff3 fs5 fc1 sc0 ls1 ws1">这是使用<span class="_ _e"> </span><span class="ff2">Eclipse<span class="_ _c"> </span></span>工具开发<span class="_ _c"> </span><span class="ff2">Android<span class="_ _e"> </span></span>必须熟练掌握的调试技术,主要包括:设置断点、查看变量值、查看当前堆栈等。打开<span class="_ _c"> </span><span class="ff2">Eclipse</span></div><div class="t m0 x3 h7 y11 ff3 fs5 fc1 sc0 ls1 ws1">工具,单击<span class="ff2">“Run” </span></div><div class="d m1"></div><a class="l" rel='nofollow' onclick='return false;'></a></div></div></body>
</html>
<div id="pf2" class="pf w0 h0" data-page-no="2"><div class="pc pc2 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/622b68be15da9b288b8925cf/bg2.jpg"><div class="t m0 x1 h2 y1 ff1 fs0 fc0 sc0 ls0 ws0">www<span class="_ _0"></span>.moandroid<span class="_ _0"></span>.com<span class="fc1 ls1 ws1"> </span></div><div class="t m0 x2 h3 y2 ff2 fs1 fc0 sc0 ls1 ws1">mo-Android <span class="ff3 ls2 ws2">感受<span class="_ _1"> </span></span>Android<span class="_ _1"> </span><span class="ff3">带给我<span class="_ _0"></span>们的新体验<span class="ff1 fc1"> </span></span></div><div class="t m0 x6 ha y12 ff2 fs5 fc1 sc0 ls1 ws1"> </div><div class="d m1"></div><a class="l" rel='nofollow' onclick='return false;'></a></div></div>
<div id="pf3" class="pf w0 h0" data-page-no="3"><div class="pc pc3 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/622b68be15da9b288b8925cf/bg3.jpg"><div class="t m0 x1 h2 y1 ff1 fs0 fc0 sc0 ls0 ws0">www<span class="_ _0"></span>.moandroid<span class="_ _0"></span>.com<span class="fc1 ls1 ws1"> </span></div><div class="t m0 x2 h3 y2 ff2 fs1 fc0 sc0 ls1 ws1">mo-Android <span class="ff3 ls2 ws2">感受<span class="_ _1"> </span></span>Android<span class="_ _1"> </span><span class="ff3">带给我<span class="_ _0"></span>们的新体验<span class="ff1 fc1"> </span></span></div><div class="t m0 x3 h7 y13 ff3 fs5 fc1 sc0 ls1 ws1">以及在调试的过程中,打开其他调试面板,相信只要使用一次就完全明白了。不要小瞧这些调试工具,只要你细心,说不定其他同事</div><div class="t m0 x3 h7 y14 ff3 fs5 fc1 sc0 ls1 ws1">好几天没有解决的<span class="_ _e"> </span><span class="ff2">bug</span>,你通过这些工具就发现了。所以熟练使用这些工具,是开发人员必须的,在有些时候甚至可以事半功倍的效</div><div class="t m0 x3 h7 y15 ff3 fs5 fc1 sc0 ls1 ws1">果。<span class="ff2"> </span></div><div class="t m0 x3 h9 y16 ff3 fs6 fc1 sc1 ls1 ws1">结合<span class="_ _c"> </span><span class="ff2 lsb wsd">Android SDK<span class="_ _f"> </span></span><span class="lsc wse">调试</span><span class="ff2"> </span></div><div class="t m0 x3 h7 y17 ff3 fs5 fc1 sc0 ls1 ws1">在复杂的程序运行过程中,如何调试程序了?把程序运行过程的信息保存为文件或者输出到<span class="_ _e"> </span><span class="ff2">IDE<span class="_ _c"> </span></span>中,这样就可以知道程序是否是正常</div><div class="t m0 x3 h7 y18 ff3 fs5 fc1 sc0 ls1 ws1">运行了。<span class="ff2"> </span></div><div class="t m0 x3 h7 y19 ff3 fs5 fc1 sc0 ls1 ws1">在<span class="_ _e"> </span><span class="ff2">Android<span class="_ _c"> </span></span>中可以使用<span class="_ _c"> </span><span class="ff2">Log<span class="_ _e"> </span></span>类,<span class="_ _b"></span><span class="ff2">Log<span class="_ _e"> </span><span class="ff3">类在<span class="_ _e"> </span></span>android.util<span class="_ _c"> </span><span class="ff3">包中,<span class="_ _10"></span>可以使用它将运行过程的信息输出到<span class="_ _e"> </span><span class="ff2">IDE<span class="_ _c"> </span></span>中,<span class="_ _10"></span>直接查看程序运行的过程。</span></span></div><div class="t m0 x3 h7 y1a ff2 fs5 fc1 sc0 ls1 ws1">Log <span class="ff3">类提供了若干静态方法</span> <span class="ff3">:</span> </div><div class="t m0 x3 ha y1b ff2 fs5 fc1 sc0 ls1 ws1">Log.v(String tag, String msg); </div><div class="t m0 x3 ha y1c ff2 fs5 fc1 sc0 ls1 ws1">Log.d(String tag, String msg); </div><div class="t m0 x3 ha y1d ff2 fs5 fc1 sc0 ls1 ws1">Log.i(String tag, String msg); </div><div class="t m0 x3 ha y1e ff2 fs5 fc1 sc0 ls1 ws1">Log.w(String tag, String msg); </div><div class="t m0 x3 ha y1f ff2 fs5 fc1 sc0 ls1 ws1">Log.e(String tag, String msg); </div><div class="t m0 x3 h7 y20 ff3 fs5 fc1 sc0 ls1 ws1">分别对应<span class="ff2"> Verbose</span>,<span class="ff2">Debug</span>,<span class="ff2">Info</span>,<span class="ff2">Warning</span>,<span class="ff2">Error</span>。<span class="ff2"> tag<span class="_ _e"> </span></span>是一个标识<span class="ff2">,</span>可以是任意字符串,通常可以使用类名<span class="ff2">+</span>方法名,主要是用来</div><div class="t m0 x3 h7 y21 ff3 fs5 fc1 sc0 ls1 ws1">在查看日志时提供一个筛选条件。程序运行后,在<span class="_ _e"> </span><span class="ff2">show view<span class="_ _c"> </span></span>中选择<span class="_ _c"> </span><span class="ff2">Locat<span class="_ _e"> </span></span>就可以直接看到输出了。也可以在程序运行后,可以通过</div><div class="t m0 x3 h7 y22 ff2 fs5 fc1 sc0 ls1 ws1">DDMS <span class="ff3">查看程序的运行过程记录,并可以通过<span class="_ _e"> </span></span>String tag<span class="_ _c"> </span><span class="ff3">来过滤输出的信息,关于<span class="_ _c"> </span></span>Android DDMS<span class="_ _e"> </span><span class="ff3">如何使用,请阅读<span class="_ _c"> </span></span><span class="fc0">Android DDMS<span class="_ _e"> </span><span class="ff3">使</span></span></div><div class="t m0 x3 h7 y23 ff3 fs5 fc0 sc0 ls1 ws1">用详细说明<span class="fc1">。<span class="ff2"> </span></span></div><div class="t m0 x3 h7 y24 ff3 fs5 fc1 sc0 ls1 ws1">除了以上方法外,我们也可以把程序运行过程信息的输出当作程序运行的一部分,比如使用<span class="_ _e"> </span><span class="ff2">Toast Notificatio<span class="_ _c"> </span></span>将输出信息显示在界</div><div class="t m0 x3 h7 y25 ff3 fs5 fc1 sc0 ls1 ws1">面中,当然这些只是些调试代码,在发布程序时需要去掉。<span class="ff2"> </span></div><div class="d m1"></div><a class="l" rel='nofollow' onclick='return false;'></a></div></div>
<div id="pf4" class="pf w0 h0" data-page-no="4"><div class="pc pc4 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/622b68be15da9b288b8925cf/bg4.jpg"><div class="t m0 x1 h2 y1 ff1 fs0 fc0 sc0 ls0 ws0">www<span class="_ _0"></span>.moandroid<span class="_ _0"></span>.com<span class="fc1 ls1 ws1"> </span></div><div class="t m0 x2 h3 y2 ff2 fs1 fc0 sc0 ls1 ws1">mo-Android <span class="ff3 ls2 ws2">感受<span class="_ _1"> </span></span>Android<span class="_ _1"> </span><span class="ff3">带给我<span class="_ _0"></span>们的新体验<span class="ff1 fc1"> </span></span></div><div class="t m0 x3 h7 y13 ff3 fs5 fc1 sc0 ls1 ws1">最后一种方法,也是最有效的一种方法,直接将运行过程的信息以文件的方式存储,在程序运行后打开文件,查看输出的信息。在一</div><div class="t m0 x3 h7 y14 ff3 fs5 fc1 sc0 ls1 ws1">些复杂的工具中,都是用这种日志文件的方法来记录文件运行的过程。如何在<span class="_ _e"> </span><span class="ff2">Android<span class="_ _c"> </span></span>中读写文件,请阅读<span class="_ _c"> </span><span class="ff2 fc0">Android<span class="_ _e"> </span><span class="ff3">数据存储(总结</span></span></div><div class="t m0 x3 h7 y15 ff3 fs5 fc0 sc0 ls1 ws1">篇)<span class="fc1">。<span class="ff2"> </span></span></div><div class="t m0 x3 h7 y26 ff3 fs5 fc1 sc0 ls1 ws1">看了以上<span class="_ _e"> </span><span class="ff2">2<span class="_ _c"> </span></span>种方法是否觉得:以上只是在发现问题后找到问题的原因,解决问题,是不是有些被动的、消极的,有没有其他有效的方</div><div class="t m0 x3 h7 y27 ff3 fs5 fc1 sc0 ls1 ws1">法来避免<span class="_ _e"> </span><span class="ff2">bug</span>?看到这<span class="ff2"> </span>里,有些<span class="ff2">“</span>牛<span class="ff2">”</span>人就说了:我写的代码几乎没有<span class="_ _c"> </span><span class="ff2">bug</span>,我的代码好几年都没有发生过崩溃现象了。从我个人的</div><div class="t m0 x3 h7 y28 ff3 fs5 fc1 sc0 ls1 ws1">观点说:<span class="_ _0"></span>的确牛。<span class="_ _2"></span>至少<span class="_ _3"></span>我自己,<span class="_ _0"></span>感觉自己的代码似乎<span class="ff2"> </span>很脆弱,<span class="_ _2"></span>要想写一个完全正确的代码真的不容易。<span class="_ _0"></span>自己考虑了很多,<span class="_ _11"></span>为什么会这</div><div class="t m0 x3 h7 y29 ff3 fs5 fc1 sc0 ls1 ws1">样,<span class="_ _2"></span>难道是自己写的代码的确很差?至少我自己在写代码的过程中都是很仔细的,<span class="_ _12"></span>尽<span class="ff2"> </span>量把问题考虑清楚了在写的,<span class="_ _12"></span>每次修改都是小心</div><div class="t m0 x3 h7 y2a ff3 fs5 fc1 sc0 ls1 ws1">翼翼的!<span class="_ _11"></span>后来发现,<span class="_ _2"></span>每段代码在写的时候都是有一些<span class="ff2">“</span>运行环境<span class="ff2">”</span>的,<span class="_ _11"></span>在后来使用的过程中,<span class="_ _11"></span>这个环境逐渐被破坏,<span class="_ _11"></span><span class="ff2"> <span class="ff3">以致最后修改的</span></span></div><div class="t m0 x3 h7 y2b ff3 fs5 fc1 sc0 ls1 ws1">乱七八糟。如果你也有同受,建议你仔细阅读以下说明!<span class="ff2"> </span></div><div class="t m0 x3 h9 y2c ff3 fs6 fc1 sc1 ls1 ws1">使用<span class="_ _c"> </span><span class="ff2 lsb wsc">JUnit<span class="_ _f"> </span></span>调试<span class="ff2"> </span></div><div class="t m0 x3 h7 y1d ff2 fs5 fc1 sc0 ls1 ws1">Android<span class="_ _e"> </span><span class="ff3">增加了对<span class="_ _c"> </span></span>JUnit<span class="_ _c"> </span><span class="ff3">的支持,这对程序员来说,是个很好消息。</span> </div><div class="t m0 x3 h7 y2d ff3 fs5 fc1 sc0 ls1 ws1">首先说明下<span class="_ _e"> </span><span class="ff2">JUnit<span class="_ _c"> </span></span>是用来解决什么问题的?<span class="ff2">JUnit<span class="_ _c"> </span></span>是采用测试驱动开发的方式,也就是说在开发前先写好测试代码,主要用来说明被</div><div class="t m0 x3 h7 y2e ff3 fs5 fc1 sc0 ls1 ws1">测试的代码会被如何使用,错误处理等;然后开始写代码,并在测试代码中逐步测试这些代码,直到最后在测试代码中完全通过。<span class="ff2"> </span></div><div class="t m0 x3 h7 y2f ff3 fs5 fc1 sc0 ls1 ws1">看了是否感觉有些不符合程序员的思维习惯(先写代码然后在调试),的确这也是<span class="_ _e"> </span><span class="ff2">JUnit<span class="_ _c"> </span></span>是对程序员思维的<span class="ff2">“</span>颠覆<span class="ff2">”</span>。在这里我自己</div><div class="t m0 x3 h7 y30 ff3 fs5 fc1 sc0 ls1 ws1">也感觉,<span class="_ _12"></span>好像很难做<span class="ff2"> </span>到,<span class="_ _2"></span>为什么?在一匹<span class="ff2">“</span>马<span class="ff2">”</span>没有完全设计好前,<span class="_ _12"></span>怎么规定这匹<span class="ff2">“</span>马<span class="ff2">”</span>将来会如何跑?而且即使把<span class="ff2">“</span>马<span class="ff2">”</span>将来会如</div><div class="t m0 x3 h7 y31 ff3 fs5 fc1 sc0 ls1 ws1">何<span class="ff2">“</span>跑<span class="ff2">”</span>定义好了,<span class="_ _12"></span>在实现的时候<span class="ff2">“</span>马<span class="ff2">”</span>被改变了怎<span class="ff2"> </span>么办?说到底还是:<span class="_ _2"></span>一个人不能同时具有<span class="_ _e"> </span><span class="ff2">2<span class="_ _c"> </span></span>个角色,<span class="_ _2"></span>否则自己有时候就不知道当</div><div class="t m0 x3 h7 y32 ff3 fs5 fc1 sc0 ls1 ws1">前是哪个角色!<span class="ff2"> </span></div><div class="t m0 x3 h7 y33 ff3 fs5 fc1 sc0 ls1 ws1">说到这里,我就说明下,我自己对<span class="_ _e"> </span><span class="ff2 wsf">JUnit “</span>错误<span class="ff2">”</span>的使用方法,这也许与<span class="_ _c"> </span><span class="ff2">JUnit<span class="_ _c"> </span></span>测试驱动开发的目的相矛盾,但是的确可以有效地减</div><div class="t m0 x3 h7 y34 ff3 fs5 fc1 sc0 ls1 ws1">少<span class="_ _e"> </span><span class="ff2">bug</span>。<span class="ff2">JUnit<span class="_ _c"> </span></span>从核心来说就是将源代码与测试代码完全分<span class="ff2"> </span>开,将测试代码作为一个单独的程序。前面介绍的方法,都将源代码与测</div><div class="t m0 x3 h7 y35 ff3 fs5 fc1 sc0 ls1 ws1">试代码合为一体,<span class="_ _2"></span>由于源代码的重要性大于测试代码的重要性,<span class="_ _2"></span>所以<span class="_ _3"></span>测试代码经常有不完<span class="ff2"> </span>整、<span class="_ _2"></span>结构不清晰等问题,<span class="_ _2"></span>这样程序员的单元</div><div class="d m1"></div><a class="l" rel='nofollow' onclick='return false;'></a></div></div>