2014-08-27 13 views
0

我试图调试使用adb外壳程序,一方gdbserver和另一方面ndk的gdb的本机构建(NDK)可执行测试(+共享库)。交叉调试时不同步的符号android ndk

我复制的可执行文件和.so到设备,并在亚行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作为远程调试“下一个语句”跳到不同PL在尝试逐步执行代码时在代码中使用Aces。这与我在gdb中执行一系列'next'命令时看到的是一样的。

设备上的gdbserver版本是7.6。

任何想法?

更新:

建设GDB 7.6.2,并使用它,而不是其自带的NDK版本我有GDB 7.3.1-GG后(r9d 64位),这些警告内部的消息错误消失了。

剩下的是代码和调试之间缺乏同步。我使用NDK_DEBUG = 1构建了代码,并将可执行文件和.so从.obj dir复制到设备,但是仍然从'gdb + gdbserver'进行分步调试时,从gdb看到的程序流程不会有道理。

+0

你可以尝试推送你的NDK的gdb并使用它。作为快速黑客,任何机会,你可以重命名(或包装)你的主要功能,使其兼容Jni,并有一个空的Java应用程序创建一个线程并调用你的本地代码,让你使用正常的ndk调试过程?您也可以尝试在示例应用程序上执行正常的ndk调试会话,同时观察确切发生的情况 - gdb选项和命令等。另一个经常有效的选择是简单地为开发机器构建代码并在其中进行调试。 – 2014-08-27 14:43:21

回答

1

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

这些都做,使工作的两件事情:

  1. 建立GDB的新版本。 NDK版本(版本r9d)随附7.3.1,我下载并使用--target=arm-linux-gnueabi构建了gdb。

  2. 以前我在Application.mk中指定-gAPP_CPPFLAGS。这一次,我指定-ggdb -O0