Androidの授業 16 [ デバッグ ] | Let's Re⇒move

Androidの授業 16 [ デバッグ ]

【 デバッグについて 】


main.xmlを以下のように記述します。

<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="
http://schemas.android.com/apk/res/android "
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:id="@+id/tv_1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
</LinearLayout>


MainActivity.javaを以下のように記述します。

package test.debugtest;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

View view = findViewById(R.id.tv_1);
setTextView(view);

Log.d("TEXT", ((TextView) view).getText().toString());
}

private void setTextView(View view) {
TextView tv = (TextView) view;
tv.setText("変更しました");
}
}



ブレークポイントを

View view = findViewById(R.id.tv_1);
に設定する
行番号は右クリック→行番号の表示を選択

ビューに式・変数を追加する

デバッグモードで実行する

F6を押すと1行進む


package test.debugtest;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

View view = findViewById(R.id.tv_1);
setTextView(view);

Log.d("TEXT", ((TextView) view).getText().toString());
}

private void setTextView(View view) {
TextView tv = (TextView) view;
tv.setText("変更しました");
}
}

上の水色の箇所でF5を押すとメソッドの中に飛んでいきます。
メソッドにエラーがないならF6で飛ばす。
メソッドが怪しくて中の状況を確認したいのであればF5を押していくとよいです。
再開はF8が早いです。


このソースの中でsetTextメソッド内の
TextView tv = (TextView) view;
にブレークポイントを設定すると、

実行されているはずなのに、どうにも反映されていないとなるとブレークポイントを設定してみてブレークしなければ「実行されていない」ということになります。

今回覚える点は

ブレークポイント、ステップイン、ステップオーバー、再開です。


無理やりエラーを起こしてみます
ソースを赤色箇所のように変更してみます。


package test.debugtest;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

View view = findViewById(R.id.tv_1);
setTextView(view);

Log.d("TEXT", ((TextView) view).getText().toString());
}

private void setTextView(View view) {
TextView tv = null;
tv.setText("変更しました");
}
}


これをデバッグでなく「実行」で起動すると落ちます。


LogCatを確認していきます。

06-13 07:12:29.428: ERROR/AndroidRuntime(413): java.lang.RuntimeException: Unable to start activity ComponentInfo{test.debugtest/test.debugtest.MainActivity}: java.lang.NullPointerException
06-13 07:12:29.428: ERROR/AndroidRuntime(413): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
06-13 07:12:29.428: ERROR/AndroidRuntime(413): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
06-13 07:12:29.428: ERROR/AndroidRuntime(413): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
06-13 07:12:29.428: ERROR/AndroidRuntime(413): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
06-13 07:12:29.428: ERROR/AndroidRuntime(413): at android.os.Handler.dispatchMessage(Handler.java:99)
06-13 07:12:29.428: ERROR/AndroidRuntime(413): at android.os.Looper.loop(Looper.java:123)
06-13 07:12:29.428: ERROR/AndroidRuntime(413): at android.app.ActivityThread.main(ActivityThread.java:3683)
06-13 07:12:29.428: ERROR/AndroidRuntime(413): at java.lang.reflect.Method.invokeNative(Native Method)
06-13 07:12:29.428: ERROR/AndroidRuntime(413): at java.lang.reflect.Method.invoke(Method.java:507)
06-13 07:12:29.428: ERROR/AndroidRuntime(413): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
06-13 07:12:29.428: ERROR/AndroidRuntime(413): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
06-13 07:12:29.428: ERROR/AndroidRuntime(413): at dalvik.system.NativeStart.main(Native Method)
06-13 07:12:29.428: ERROR/AndroidRuntime(413): Caused by: java.lang.NullPointerException
06-13 07:12:29.428: ERROR/AndroidRuntime(413): at test.debugtest.MainActivity.setTextView(MainActivity.java:24)
06-13 07:12:29.428: ERROR/AndroidRuntime(413): at test.debugtest.MainActivity.onCreate(MainActivity.java:17)
06-13 07:12:29.428: ERROR/AndroidRuntime(413): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
06-13 07:12:29.428: ERROR/AndroidRuntime(413): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
06-13 07:12:29.428: ERROR/AndroidRuntime(413): ... 11 more

「E」は動作がとまる致命的なエラーです。
一番最新の行に、

エラーがあるときに何をするか

エラーが起きたとき、LogCatを見に行って、現在作っているアプリのパッケージ名があるかどうかを見に行きます。
今作っているパッケージがあれば、それをダブルクリックするとそこに飛んでくれます。
エラーが起きたときにやる第一歩です。
何が原因でというのは
「Caused by ・・・」以下に表示されます。

これで解決できない場合。
エラーになれば必ず落ちてしまう。


デバッグ画面の使い方を見ていきます。

式タブ→右クリック→式の追加

APIが分からない時に、いくつか書いて試してみて欲しい戻り値のものを採用するときにも使えます。

ブレークポイントタブは

ブレークポイントを追加していくと増えていき、消すとその項目も消えます。

タブの中のアイコンは用途によって使っていくと便利です。

次に左上「デバッグ」タブ
アプリを停止したいときは赤四角のアイコンを押します。

次に右下「LogCat」


MoveViewプロジェクトを開いてみてください。

この中のタッチイベントを拾うメソッドの中にブレークポイントを設定した場合
動いた瞬間に止まってしまうのでデバッグができない場合があります。

そんなときにはLogを仕込んであげるとデバッグが可能となります。

たとえば、ソースに
Log.d(“ACTION_MOVE”, “X =” + x + “ y=” + y);
とすると
LogCatに実行しながら現在進行形で値が表示されます。


コネタとして、何も間違っていないのになぜ動かないのかという場合、
adb kill-server
adb start-server

とやると、動く場合があります。何故かインストールもできない、何故かデバッグもできない場合
上記のコマンドを試してみてください。

LogCatが起動しているにもかかわらず、Logが表示されない場合
DDMSを開いて、LogCat対象としたい実機もしくはエミュレータを選択してみてください。


いろいろ試して、使い方に慣れていくのがよいと思います。