【问题标题】:Android NDK + GDB安卓 NDK + GDB
【发布时间】:2013-04-23 12:26:54
【问题描述】:

请帮助我使用 ndk-gdb!

我搜索了 StackOverflow 和其他互联网 =) 但仍然做错了。

配置:MacOSX 64 + 最新 SDK + 最新 NDK + 最新 IDEA + Nexus 7 + 巨大的 C++ 项目。

我做了所有常见的安排:

  • -g -ggdb -O0LOCAL_CFLAGS(也试过 -g
  • APP_OPTIM := debug
  • debuggable=«true» 在清单中
  • ndk-build NDK_DEBUG=1

我得到了预期的 gdb.setup 和 gdbserver 文件,但是 nm 命令在我的 *.so 文件上给我零输出。

我在项目的根文件夹中运行 ndk-gdb 并开始工作 GDB - 例如我可以暂停应用程序并恢复它,可以在地址上获取 ASM 代码等等。即使我用break Class::method 设置了刹车点,gdb 也会告诉我正确的文件名和行号。

但是断点没有达到 99%。 Backstack 总是明显错误(错误的方法名称)。看起来所有符号名称和地址都映射错了。

我错过了什么?

UPD。 gdb 输出以两个命令 info sharedlibraryC 开头。

:ndk-gdb

/android-ndk-macosx/build/core/add-application.mk:128: Android NDK: WARNING: APP_PLATFORM android-14 is larger than >android:minSdkVersion 8 in ./AndroidManifest.xml
/android-ndk-macosx/build/core/add-application.mk:128: Android NDK: WARNING: APP_PLATFORM android-14 is larger than >android:minSdkVersion 8 in ./AndroidManifest.xml
/android-ndk-macosx/build/core/add-application.mk:128: Android NDK: WARNING: APP_PLATFORM android-14 is larger than >android:minSdkVersion 8 in ./AndroidManifest.xml
/android-ndk-macosx/build/core/add-application.mk:128: Android NDK: WARNING: APP_PLATFORM android-14 is larger than >android:minSdkVersion 8 in ./AndroidManifest.xml

GNU gdb (GDB) 7.3.1-gg2
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=x86_64-apple-darwin --target=arm-linux-android".
For bug reporting instructions, please see:
<http://source.android.com/source/report-bugs.html>.

warning: .dynamic section for "/Users/<...>/android/obj/local/armeabi/lib1.so" is not at the expected address (wrong library or version >mismatch?)
warning: Could not load shared library symbols for 73 libraries, e.g. libstdc++.so.
Use the "info sharedlibrary" command to see the complete listing.
Do you need "set solib-search-path" or "set sysroot"?
warning: Breakpoint address adjusted from 0x400aca53 to 0x400aca52.
0x401a7ee4 in epoll_wait () from /Users/<...>/android/obj/local/armeabi/libc.so
(gdb) info sharedlibrary
From        To          Syms Read   Shared Object Library
0x400aa220  0x400b2978  Yes (*)     /Users/<...>/android/obj/local/armeabi/linker
0x4019c860  0x401cc184  Yes (*)     /Users/<...>/android/obj/local/armeabi/libc.so
                        No          libstdc++.so
                        No          libm.so

<...dozens of system libs with "no"...>

                        No          libjnigraphics.so
0x6749c160  0x67527844  Yes (*)     /Users/<...>/android/obj/local/armeabi/lib1.so
0x65c487f8  0x65c6634c  Yes (*)     /Users/<...>/android/obj/local/armeabi/lib2.so
0x693e62e8  0x699dcd90  Yes         /Users/<...>/android/obj/local/armeabi/lib3.so
(*): Shared library is missing debugging information.
(gdb) C
Continuing.>

你可以看到

  • lib3.so(主库)加载最正确(或没有?)
  • 断点地址调整(什么意思?)

【问题讨论】:

  • 您可能没有为 gdb 和设备使用相同的构建结果。此外,还生成了两组库,一组带有保留符号,另一组被剥离以安装在设备上,您可能正在剥离的副本上运行 nm。在构建树上进行 find 并检查找到的所有 .so 的大小,您将看到哪些是哪些。
  • 好的。刚刚在项目根目录中执行for f in find . -name "*.so"; do echo $f; nm $f; done 仍然一无所获。位于 ./libs 和 ./obj 中的 SO 文件。如何检查我是否使用了错误的库?
  • 这显然是不对的,因为没有任何符号,库就不能运行时链接。确保您使用的是 ndk 的适当架构前缀工具,为此请尝试其 objdump。
  • +1 我的项目目录中有一个共享库的错误副本......工具是如何选择它而不是可调试库的。很有帮助。

标签: android android-ndk gdb native ndk-gdb


【解决方案1】:

好的,我终于成功了。重点是在Application.mk 中的APP_ABI 行。有两个 ABI,不知何故这使 GDB 感到困惑。现在它适用于一个 abi(我选择了armeabi-v7a)。

还有一些我也想注意的事情

  • 您实际上不需要做任何事情来使 GDB 正常工作。只是不要打扰他=)
  • 每个变量(cflag 或清单标记等)都有适合调试的默认值,但没关系,我建议您在Application.mk 中显式设置APP_OPTIM := debugAPP_CFLAG := -g -ggdb -O0android:debuggable="true" 在清单中,NDK_DEBUG=1 用于 ndk-build。我还没有弄清楚它们是否能以某种方式帮助 GDB 更好地工作。其中一些是彼此的重复。当然,它们中的任何一个都不会做得更糟。
  • 正常,当Breakpoint address adjusted
  • NM 命令。我也不太了解它,但它总是在我猜测要检查的每个文件上给我零输出。真正重要的是 - info sharedlibrary 命令在工作 GDB 中的输出。检查您的库是否有符号(如上面示例中的我的lib3.so)。这是必要的,但还不够。

【讨论】:

    猜你喜欢
    • 2014-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    相关资源
    最近更新 更多