交叉调试android ndk时符号不同步

时间:2014-08-27 14:33:56

标签: android android-ndk gdb gdbserver ndk-gdb

我尝试使用adb shell调试本机构建(NDK)可执行测试(+共享库),一方使用gdbserver,另一方使用ndk的gdb。

我将可执行文件和.so复制到设备并在adb shell中执行:

$ gdbserver :5039 ./my_test my_args
Process ./my_test created; pid = 11131
Listening on port 5039

在主机上,我在同一个my_test可执行文件上运行gdb:

$ $NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gdb ./my_test

在main()中添加一个断点:

Reading symbols from /.../my_test...done.
(gdb) target remote :5039
Remote debugging using :5039
warning: Unable to find dynamic linker breakpoint function.
GDB will retry eventurally.  Meanwhile, it is likely
that GDB is unable to debug shared library initializers
or resolve pending breakpoints after dlopen().
0xb6f71a60 in ?? ()
(gdb) b main
Cannot access memory at address 0x0
warning: (Internal error: pc 0xa468 in read in psymtab, but not in symtab.)

warning: (Internal error: pc 0xa468 in read in psymtab, but not in symtab.)

warning: (Internal error: pc 0xa468 in read in psymtab, but not in symtab.)

warning: (Internal error: pc 0xa46c in read in psymtab, but not in symtab.)

warning: (Internal error: pc 0xa468 in read in psymtab, but not in symtab.)

...

当连接到eclipse时,远程调试' next语句'当我尝试逐步执行代码时跳转到代码中的不同位置。当我做一系列“下一步”时,我看到了同样的事情。 gdb中的命令。

设备上的gdbserver版本是7.6。

有什么想法吗?

更新

在构建gdb 7.6.2并使用它而不是我所拥有的NDK版本(r9d 64位)附带的gdb 7.3.1-gg之后,那些内部错误的警告消息消失了。

剩下的是代码与调试之间缺乏同步。我使用NDK_DEBUG = 1构建了代码,并将.obj目录中的可执行文件和.so复制到了设备中,但是当我逐步执行此操作时仍然可以执行此操作。从gdb + gdbserver调试从gdb看到的程序流没有任何意义。

1 个答案:

答案 0 :(得分:1)

好的,问题已解决。现在,从gdb看到的程序流程看起来像预期的那样。

这些是完成的两件事并使之成功:

  1. 构建较新版本的gdb。我没有使用NDK版本(版本r9d)附带的7.3.1,而是使用--target=arm-linux-gnueabi下载并构建了gdb并使用它。

  2. 之前我在Application.mk中的-g中指定了APP_CPPFLAGS。这一次,我指定了-ggdb -O0