Android:调试共享库

3

我想调试Android NDK应用程序,更准确地说 - 我想检查从apk中的共享库传递给函数的参数(r1-r4寄存器)。

我尝试过:

  • 在设备上运行gdbserver :1234 --attach
  • 从Google的ndk软件包中运行arm-linux-androideabi-gdb
  • 我设置了solib-search-path并编写了target remote :1234

到目前为止,一切都很好。现在我尝试设置断点(break <function name>)(从objdump获取函数名称),但我得到回复:Cannot access memory at address <...>info shared显示库已加载,这是否意味着我无法在那里设置断点?或者我做错了什么?


1
你是否意识到,在AAPCS中,寄存器r4-r8不是函数参数?寄存器r0-r3是前4个参数,其余的放在堆栈上。引用一下:“_前四个寄存器r0-r3(a1-a4)用于将参数值传递到子例程并从函数返回结果值。它们也可以用于在例程内保持中间值(但通常仅在子例程调用之间)。_”和“_子例程必须保留寄存器r4-r8、r10、r11和SP的内容(在PCS变体中指定r9为v6的情况下还包括r9)。” - Iwillnotexist Idonotexist
好的,谢谢提供信息(我在网上找到了有关寄存器r4-r8的信息),你有什么想法如何设置函数断点? - Andy
2个回答

2
ndk-build脚本的功能远不止你所想的那么简单。
其中一个功能就是将gdbserver、名为gbd.setup的文件以及生成的.so文件复制到一个名为.obj/armei/的隐藏文件夹中。
在这里,您需要添加要调试的库,因为符号引用它们。
这些库是通过一些adb shell pull命令从设备复制到计算机上的。
我在以下链接中撰写了一篇文章:http://www.professional-android-development.com/articles/android-ndk-large-c-projects
将库放入正确的文件夹后,您可以设置断点。
但是,由于某些内部原因,它们可能会失败。
在这种情况下,请运行ndk-gdb --start(第一次尝试也会失败),强制应用程序关闭并重新运行ndk-gdb --start(这次不要强制应用程序关闭)。

然而,如果我没有源代码,我可以使用它吗? - Andy
是的,如果您想要调试的库带有调试符号,则可以。因此,这取决于共享库是如何编译的(-g选项)。如果它是来自AOSP的库,您可以尝试自己构建它,但这需要一个已获得root权限的智能手机,并将库安装在正确的位置。如果它是第三方库,您无法访问,则可以询问他们的支持是否提供了可调试版本的库。 - Peter

0
"

无法访问地址为<...>的内存

"通常意味着您的PC上的.so文件与Android上的.so文件不匹配。您是否重新编译并重新安装了它?

顺便问一下,您为什么不使用"ndk-gdb"?那是一个脚本(NDK的一部分),可以为您处理所有繁琐的细节。

"

ndk-gdb需要源代码,对吗? - Andy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接