GDB调试android 的lib.so的一些体会

首先是习惯了IDE界面,在gdb命令下真的不方便。gdb调试这前是用ndk-build编译。.so。用ndk-build编译编译时,在JNI的调用用中比如 public native String stringFromJNI(); 这个函数在代码编辑中会显示找不到的错误。 build就是了,不要管它。ndk-build和AS的容合没有CMAKE做的好。要写代码的自已保证名字参数的一致性,如非必要还是用CMAKE好。

1,准备工作,要做好。ndk-gdb-py或者ndk-gdb,是停在libc这个库的入口和出口处的。如果你的代码不能,在这之后由人品输入调用的话,是永远不会进入到你自已的lib代码中的。所以对lib的调用写成由用户接口调用吧。只少调试时要这样调用。因为都gdb是命令,就是命令输入键码去调用自已lib的中函数吧。

@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
    if (event.getAction() == KeyEvent.ACTION_DOWN) {
        desc = String.format("%s输入的软按键编码是%d,动作是按下", desc, keyCode);
        if (keyCode == KeyEvent.KEYCODE_A) {
            desc=stringFromJNI();
        }
  TextView tv = (TextView) findViewById(R.id.sample_text);
    tv.setText(stringFromJNI());
    Log.d(TAG, desc);
    return true;
} else {
    //返回true表示处理完了不再输入该字符,返回false表示给你输入该字符吧
    return false;
}

这个boolean onKey还要显式的

EditText tv = (EditText) findViewById(R.id.sample_text);
tv.setOnKeyListener(this);

这在oncreate中调用就是了,主要是这tv还不能是 textview还必须是能输入的EditText。算了,如果在应用中直接影响按键有空再去找找吧。可能是因为引的OnKeyListener 是 android.view.View.OnKeyListener;下面的类别。别一个是对话类别的,有一个能用就这样调吧。这样做只是引入手工对代码的可控多次调用。

2,启动代码用

ndk-gdb-py --verbose --start --nowait --adb D:\android-sdk\platform-tools\adb.exe

我没把adb加入的系统路径中,所以要指示出。 --nowait 与--start就加吧。不加上,自已到gdb命令下又要补一些命令。我的应用中没这个必要。

3,进入gdb命令模式了。进不了的话--verbose参数打出的信息好好看看,找一找原因。

第一个常用命令就是加断点 b(全称是breakpoint)

b Java_com_home_ququ_videotest_MainActivity_stringFromJNI 加在JNI调用入口

b native-lib.cpp:12 加在实现的CPP其中一有效行。12是行数,就是cpp中什么都上的行数。与AS标的行号是一至的。

d (delete) 删除全部断点。d 1 册一号断点。

info break 打印全部断点。

p (变量名) 打印变量值,变量一定要有效。也就是停止的断点的作用域中,要有这个变量。

b 不带参数,现显现在的断点。

x(examine)  用于显示内存。x/3uh 0x54320 表示,从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示三个单位,u表示按十六进制显示。

quit或者ctl+c可以退出gdb命令模式。

如果命令不熟,用help。但这个可能没用百度好用,因不没示例,没有百度上找到的有示例的命令用法,上手快。基本上能看看变是,看看程序是路到了什么地方,在什么地方出现分支了,就满足初步的应用了。

如果gdb中间出现卡死,就要再开一个adb命令窗口,进入kill两个进程,gdbserver与app两个进程都清一下。然后就重新重第一步开始。不熟gdb命令的话,真的容易卡死。

最后,有个android的问题,代码找时间不活动,会出现无响影报错,看上去还是要找一找,不通过界面后台手工调用lib的函数的方法。要不调试时会把界面卡住,又引起这个android以为应用已停的错误。真是不方便啊。

猜你喜欢

转载自blog.csdn.net/qushaobo/article/details/81150101