像Android 这样的 Java, C/C++ 混合的应用,如何进行调试
Native (C/C++) 调试比较简单,启动程序(source 加入 sleep ) , 再启动 gdb 而后把 attach pid 就可以了
Java是否更简单,Eclipse 本来就通过 ddms 提供此功能
但是如果没有adb, 没有ddms能否做调试
现在我想对 dalvikvm 上运行的代码进行调试
1) 首先在在 eclipse 中建一个 helloworld 程序
而后到 bin 找到生成的程序,直接用 7z 打包 hello.zip (从根路径打包, 子路径和文件是:com\pnp\hello\Main.class)
2) sun java 的 bytecode 是不能被 dalvikvm 解释执行的,转化
D:\>dx --dex --output=c:\hello.dex C:\e\workspace_android\hello\bin\hello.zip
3) 准备启动 dalvik
a) dalvik 是需要load java 基本类的
设置环境变量,告诉 daolvik 包的位置
export ANDROID_ROOT=/home/user/jb/system
export FRAMEWORK=$ANDROID_ROOT/framework
export BOOTCLASSPATH=$FRAMEWORK/core.jar:$FRAMEWORK/core-junit.jar:$FRAMEWORK/bouncycastle.jar:$FRAMEWORK/ext.jar:$FRAMEWORK/framework.jar:$FRAMEWORK/android.policy.jar:$FRAMEWORK/services.jar:$FRAMEWORK/apache-xml.jar
(上面的 jar 有些可能是不需要的)
b) 用下面的命令就可以运行程序了
./dalvikvm -cp hello.dex com.pnp.hello.Main
4)用jdb调试程序dalvik上跑的java程序
我现在没有ddms, 只有jdb.
jdb是 sun 提供的工具,能否调试 dalvikvm 上的程序。我想是可以因为他们都遵循 jdwp 这个规范
a)启动应用程序
./dalvikvm -agentlib:jdwp=transport=dt_socket,address=8011,server=y,suspend=y -cp hello.dex com.pnp.hello.Main
b) 用 jdb 连接端口成功了
jdb -attach localhost:8011
c) 使用调试命令
stop at com.pnp.hello.Main:7
stop in com.pnp.hello.Main.main
命令比较
gdb jdb
bt where
del clear
stop break
finish step up
更多
http://www.fas.harvard.edu/~cscie119/resources/jdb_reference.pdf
5)如果想看但 source code
用命令
jdb -classpath robocode/libs/robocode.jar:bin -sourcepath src
内部设置 sourcepath 用 "use"
6)想看看jmap 是否也work
jmap -heap 29959
报告下面错误,看来只有 jdb 能混用
sun.jvm.hotspot.debugger.NoSuchSymbolException: Could not find symbol "gHotSpotVMTypes" in any of the known library names (libjvm.so, libjvm_g.so, gamma_g)
Native (C/C++) 调试比较简单,启动程序(source 加入 sleep ) , 再启动 gdb 而后把 attach pid 就可以了
Java是否更简单,Eclipse 本来就通过 ddms 提供此功能
但是如果没有adb, 没有ddms能否做调试
现在我想对 dalvikvm 上运行的代码进行调试
1) 首先在在 eclipse 中建一个 helloworld 程序
而后到 bin 找到生成的程序,直接用 7z 打包 hello.zip (从根路径打包, 子路径和文件是:com\pnp\hello\Main.class)
2) sun java 的 bytecode 是不能被 dalvikvm 解释执行的,转化
D:\>dx --dex --output=c:\hello.dex C:\e\workspace_android\hello\bin\hello.zip
3) 准备启动 dalvik
a) dalvik 是需要load java 基本类的
设置环境变量,告诉 daolvik 包的位置
export ANDROID_ROOT=/home/user/jb/system
export FRAMEWORK=$ANDROID_ROOT/framework
export BOOTCLASSPATH=$FRAMEWORK/core.jar:$FRAMEWORK/core-junit.jar:$FRAMEWORK/bouncycastle.jar:$FRAMEWORK/ext.jar:$FRAMEWORK/framework.jar:$FRAMEWORK/android.policy.jar:$FRAMEWORK/services.jar:$FRAMEWORK/apache-xml.jar
(上面的 jar 有些可能是不需要的)
b) 用下面的命令就可以运行程序了
./dalvikvm -cp hello.dex com.pnp.hello.Main
4)用jdb调试程序dalvik上跑的java程序
我现在没有ddms, 只有jdb.
jdb是 sun 提供的工具,能否调试 dalvikvm 上的程序。我想是可以因为他们都遵循 jdwp 这个规范
a)启动应用程序
./dalvikvm -agentlib:jdwp=transport=dt_socket,address=8011,server=y,suspend=y -cp hello.dex com.pnp.hello.Main
b) 用 jdb 连接端口成功了
jdb -attach localhost:8011
c) 使用调试命令
stop at com.pnp.hello.Main:7
stop in com.pnp.hello.Main.main
命令比较
gdb jdb
bt where
del clear
stop break
finish step up
更多
http://www.fas.harvard.edu/~cscie119/resources/jdb_reference.pdf
5)如果想看但 source code
用命令
jdb -classpath robocode/libs/robocode.jar:bin -sourcepath src
内部设置 sourcepath 用 "use"
6)想看看jmap 是否也work
jmap -heap 29959
报告下面错误,看来只有 jdb 能混用
sun.jvm.hotspot.debugger.NoSuchSymbolException: Could not find symbol "gHotSpotVMTypes" in any of the known library names (libjvm.so, libjvm_g.so, gamma_g)