2013年2月4日 星期一

[Android&嵌入式]Debug之章


打開Android C文件中的LOG
資料來源: http://www.bobbog.com/archives/10

可以一次打開LOGV,LOGI,LOGD,也可以分別打開:
1.#undef NDEBUG       //打開LOGV/LOGI/LOGD
2.#define LOG_NDEBUG   0  //打開LOGV
3.#define LOG_NIDEBUG  0  //打開LOGI
4.#define LOG_NDDEBUG 0 //打開LOGD
舉例
舉例,如果要看AndroidRuntime的LOGI和LOGD,可以有這樣2種寫法:
方法一
NDEBUG-LOG_NDEBUG=LOG_NIDEBUG +LOG_NIDEBUG
1.#define LOG_TAG "AndroidRuntime"
2.#undef NDEBUG
3.#define LOG_NDEBUG 1
4.#include

方法二
LOG_NIDEBUG +LOG_NIDEBUG
1.#define LOG_TAG "AndroidRuntime"
2.#define LOG_NIDEBUG 0
3.#define LOG_NDDEBUG 0
4.#include



Android中Debug模式分為    :模擬器Debug 跟 Serial port 實機Debug
模擬器Debug

Survey:Eclipse 執行Debug 除錯模式

在 Eclipse 中,要進行 Debug 除錯模式,跟其他 IDE 開發工具一樣,先設定 Breakpoint, 然後執行 Debug 即可,實現如下 :

1) 雙擊要中斷, 進行 Debug 的程式行 :


2) 在專案的地方, 按右鍵, 選擇 "Debug As / 執行方式" :


3) 按 "No", 讓 Debug 視窗不會佔用太多視窗空間, 而在下方多一個 Debug 頁籤 :




4) Debug 若採用 "Step Into", 則遇到函數的地方, 會進入該函數內部, 一行一行執行 :




5) Debug 若採用 "Step Over", 則遇到函數的地方, 會直接執行該函數, 而不會進入函數內部 :




6) Debug 時候, 若想查看變數的資料變化, 可以開啟 Variables 視窗, 如下 :






先前一直想更進階一些工作來對嵌入式android進行debug...
因此也問了一些人 得到一些關鍵字screen、Log.v等 因此在網路上找了資料以後 看到一個還不錯且完整的文章,經整理加消化後如下:

android.util.Log常用的方法有五個:
1.Log.v() - VERBOSE : Log.v 的颜色是黑色的,任何訊息都會輸出,這裡的v代表verbose囉嗦的意思,平時使用就是Log.v("","");
2.Log.d() - DEBUG:Log.d的输出颜色是蓝色的,仅输出debug调试的意思,但他会输出上层的信息,过滤起来可以通过DDMS的Logcat标签来选择.
3.Log.i() - INFO:Log.i的输出为绿色,一般提示性的消息information,它不会输出Log.v和Log.d的信息,但会显示i、w和e的信息
4.Log.w() - WARN:Log.w的意思为橙色,可以看作为warning警告,一般需要我们注意优化Android代码,同时选择它后还会输出Log.e的信息。
5.Log.e() - ERROR:Log.e为红色,可以想到error错误,这里仅显示红色的错误信息,这些错误就需要我们认真的分析,查看栈的信息了。


下面是一個简单的LogDemo(Step By Step):
Step 1:勤前作業(打開LogCat视窗).
 開啟Eclipse,在Window > Show View會出現一個對話方塊,點選後LogCat會出現在主程式編輯區下方,如圖:

 

Step 2:新建一个Android專案,命名為LogDemo.

Step 3:設計UI介面,添加一個Button按钮(點按鈕會出現Log日誌訊息).

Main.xml內容如下:
http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    android:layout_width="fill_parent"     android:layout_height="wrap_content"     android:text="@string/hello"    />

Step 4:撰寫主程式LogDemo.java:
package com.android.test;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class LogDemo extends Activity {

 private static final String ACTIVITY_TAG="LogDemo";
 private Button bt;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //通過findViewById找到Button物件
        bt = (Button)findViewById(R.id.bt);
        //增加按鈕事件
        bt.setOnClickListener(new Button.OnClickListener(){    @Override
   public void onClick(View v) {
    Log.v(LogDemo.ACTIVITY_TAG, "This is Verbose.");
    Log.d(LogDemo.ACTIVITY_TAG, "This is Debug.");
    Log.i(LogDemo.ACTIVITY_TAG, "This is Information");
    Log.w(LogDemo.ACTIVITY_TAG, "This is Warnning.");
    Log.e(LogDemo.ACTIVITY_TAG, "This is Error.");
   }
         
        });

    }

}

Step 5:執行LogDemo專案,結果如下:


當我們點選按鈕時,會觸發按鈕事件,在Logcat視窗下有如下效果:


進階應用[Android]應用RS232 Console port+Ubuntu的Screen對實機Debug
首先需要準備

1.若Linux沒有screen的話裝一下,套件名稱就是screen,我的系統是ubuntu 所以安裝指令會是:sudo apt-get install screen
2.裝好之後透過切換到dev目錄 即cd /dev 去找相對應的位置
像我接上去後 要用screen找到port我會輸入
sudo screen /dev/ttyUSB0 115200
screen指令:

重連 輸入 screen -r
結束 輸入(Ctrl + a) + d
拷貝模式 (複製):輸入Ctrl + a + [
可用"上(K)下(J)左(H)右(L)",或"PageUp和PageDown" 移動
移動到開始複製點 按空白鍵(space) , 再移動到結束複製點 按空白鍵(space).
設定Screen的緩衝Buffer:
1vim /etc/screenrc
2#设置screen窗口缓存100万行
3defscrollback 40000
拷貝模式 (貼上):


這樣就可以連接到了
若是實體裝置附帶ip可以使用
adb connect ip
或一般的 adb shell 就可以接著下指令
3.用logcat & 其實是很災難式的作法

1. 只显示需要的输出,白名单
最方便的当然是通过管道使用 grep 过滤了,这样可以使用 grep 强大的正则表达式匹配。简单的匹配一行当中的某个字符串,例如 MyApp:
adb logcat | grep MyApp
adb logcat | grep -i myapp #忽略大小写。
adb logcat | grep --color=auto -i  myapp #设置匹配字符串颜色。更多设置请查看 grep 帮助。
进阶一点可以使用 grep 的正则表达式匹配。例如上一个例子会匹配一行中任意位置的 MyApp,可以设置为仅匹配 tag。默认的 log 输出如下,如果修改过输出格式相应的表达式也要修改。
I/CacheService(  665): Preparing DiskCache for all thumbnails.
可以看出 tag 是一行开头的第三个字符开始,根据这点写出表达式:
adb logcat | grep "^..MyApp"
根据这个格式也可以设置只显示某个优先级的 log,再匹配行首第一个字符即可。例如仅显示 Error 级别 tag 为 MyApp 的输出:
adb logcat | grep "^E.MyApp"
当然也可以匹配多个,使用 | 分割多个匹配表达式,要加转义符。例如要匹配 tag 为 MyApp 和 MyActivity 的输出:
adb logcat | grep "^..MyApp\|^..MyActivity"
adb logcat | grep -E "^..MyApp|^..MyActivity"  #使用 egrep 无须转义符
2. 过滤不需要的输出,黑名单
还是使用 grep,用法也跟上面的一样,加一个 -v 即可。例如要过滤 tag 为 MyApp 和 MyActivity 的输出:
adb logcat | grep -v "^..MyApp\|^..MyActivity"
adb logcat | grep -vE "^..MyApp|^..MyActivity"  #使用 egrep 无须转义符
3. 显示同一个进程的所有输出
有时一个程序里面的 tag 有多个,需要输出该程序(同一个 PID)的所有 tag;仅使用 tag 过滤有时也会漏掉一些错误信息,而一般错误信息也是和程序同一个 PID。还是通过 grep 实现,思路是先根据包名找到 pid 号,然后匹配 pid。写成 shell 脚本如下,参数是程序的 java 包名(如 com.android.media)。
#!/bin/bash
packageName=$1
pid=`adb shell ps | grep $packageName | awk '{print $2}'`
adb logcat | grep --color=auto $pid
4. 从当前开始显示
logcat 有缓存,如果仅需要查看当前开始的 log,需要清空之前的。
adb logcat -c && adb logcat

此外,若使用logcat_-s_"定義過濾字串值"   則可印出我們"想要"印出的字串 
5. 过滤 log 文件
有时需要分析 log 文件,过滤 log 文件还是使用 grep。例如 log 文件为 myapp.log,要匹配 tag 为 MyApp 和 MyActivity 的输出,然后输出到 newmyapp.log:
cat myapp.log | grep "^..MyApp\|^..MyActivity" > newmyapp.log
Windows 下推荐使用Notepad++,一个免费强大的记事本,支持正则表达式查找替换。可以高亮显示匹配内容,也可以删除不需要的内容。
以上的技巧主要用到了 grep,其实 logcat 本身也有过滤功能,可以根据 tag、优先级过滤 log,具体请参考 Android 官方文档Reading and Writing Logs








進階應用[Android]應用SDK的Dalvik Debug Monitor對實機Debug(轉載)
轉載自:[進階] 高手使用Android 的方式

注意:因為Linux SDK不支援USB所以沒辦法使用

環境說明

Android 裝置:Android Dev Phone 1
說明:透過 Dalvik Debug Monitor 抓取 Android 的螢幕畫面。

下載並安裝 ANDROID USB 驅動程式

  1. 下載並安裝 Android SDK,Dalvik Debug Monitor 是包含在 Android SDK,所以首先要取得 Android SDK,網址:http://developer.android.com/sdk/1.5_r2/index.html
    根據不同的平台抓取不同的版本,下載後解壓縮就完成安裝了。
     
  2. 將 Android Dev Phone 透過 USB 線連接到 Windows,這時 Windows 會出現「尋找新增硬體精靈」的對話框。
    選擇「不,現在不要」後點選「下一步


    選擇「從清單或特定位置安裝」>「下一步


    選取「搜尋時包括這個位置」,可以透過「瀏覽」來找到 Android 驅動程式的位置。


    位置在 SDK資料夾下的「usb_deiver


    之後開始安裝就會識別出「HTC Dream Composite ADB Interface


    等候一下就可以完成安裝。

開啟 ANDROID DEV PHONE 1 的 USB DEBUGGING

  1. 在 Android Dev Phone 上開啟「USB debugging」,在「Home」的畫面中按下「MENU」,並選擇「Setting」。


    進入「Applications」>「Development


    將「USB debugging」勾選,這樣一來 Dalvik Debug Monitor 就可以透過 USB 取得手機的畫面。

啟動 DALVIK DEBUG MONITOR

  1. 開啟 Dalvik Debug Monitor,回到「SDK資料夾」進入「tools」並執行「ddms.bat


    之後就會執行「Dalvik Debug Monitor」,記得要先點選「Name」中的「HT845****」這樣 ddms 才會與手機連線。


    在「Device」>「Screen capture」就可以擷取畫面


    點選「Save」就可以儲存畫面了。

參考連結



沒有留言:

張貼留言