官术网_书友最值得收藏!

Debugging

As mentioned before, the easiest way to debug an Android application running on either a device or an AVD instance is to output debug messages to the log output (LogCat) so that they can be read via ADB. The API in Android for this purpose is the Log class. It uses various categories to distinguish between the importance of the messages, ranging from verbose to error.

For example, to output a debug string to LogCat, we use the following code in Java:

Log.d("AndEngineOnTour", "This is debug output.");

The first part is the tag for the application or class that we output from, and the second part is the actual message. The tag is used in filtering to, for example, only see the output from our own application. We can also use a filter on the log category.

When writing native code in C/C++ using the Native Development Kit (NDK), we may also want to use LogCat. Here, we just have to include one header and use a slightly modified function call, like this:

#include <android/log.h>
__android_log_print(ANDROID_LOG_DEBUG, "AndEngineOnTour", "This is debug output");

Finally, we can use a debugger. For Java, this is easy, with IDEs such as Eclipse/ADT offering ready-to-use debugging functionality with full integration. This allows easy debugging, adding of breakpoints, and the like. For native code, this is slightly more complex, as we have to resort to using gdb.

The gdb tool is part of the GNU Compiler Collection (GCC), which also contains the compiler used to compile the native code for an Android application. In this case, we want to use its gdb debugger to attach to the native code process on the Android device or AVD so that we can set breakpoints and otherwise monitor the execution.

For gdb to be able to work with such a process, we need to compile the native code with debug symbols enabled, and modify the Android manifest. This involves the following steps:

  • AndroidManifest.xml needs the android:debuggable="true" setting in the <application> tag
  • The Application.mk file needs APP_OPTIM := debug added
  • Finally, we use NDK_DEBUG=1 in the command that we use to build the native code

The NDK contains a script called ndk-gdb that automates the process of setting up gdb, but the essence of what is involved is that we need to push the gdbserver instance onto the device or AVD that we intend to debug on, and connect to this server remotely with gdb. The details of this procedure are beyond the scope of this book, however.

主站蜘蛛池模板: 桓仁| 仁布县| 东平县| 城口县| 清流县| 蒙自县| 剑川县| 丰台区| 甘肃省| 山东| 商南县| 葫芦岛市| 依兰县| 禹州市| 濉溪县| 稻城县| 遂溪县| 台安县| 高陵县| 喜德县| 兴隆县| 都昌县| 河西区| 南涧| 云南省| 岗巴县| 余江县| 三江| 迭部县| 阳江市| 正镶白旗| 舞钢市| 马边| 天台县| 喀什市| 仙居县| 建平县| 广宗县| 隆安县| 万州区| 大冶市|