0

我正在尝试使用 adb shell、一侧的 gdbserver 和另一侧的 ndk 的 gdb 来调试本机构建的(NDK)可执行测试(+共享库)。

我将可执行文件和 .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 作为远程调试时,当我尝试逐步执行代码时,“下一条语句”会跳转到代码中的不同位置。这与我在 gdb 中执行一系列“下一步”命令时看到的相同。

设备上的 gdbserver 版本为 7.6。

有任何想法吗?

更新:

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

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

4

1 回答 1

1

好的,问题解决了。现在从 gdb 看到的程序流程看起来符合预期。

这是已完成并使其发挥作用的两件事:

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

  2. 以前我-gAPP_CPPFLAGSApplication.mk 中指定。这一次,我指定了-ggdb -O0.

于 2014-09-01T11:39:19.510 回答