【发布时间】:2020-01-29 22:53:07
【问题描述】:
我在面向 Android 的 Visual Studio 2019 社区版中设置了 C++ gradle 应用程序。我正在使用 NDK 20(Microsoft 的 android sdk repo 中的最新版本)。
这个应用程序由几个 .so 库(SDL2、SDL2_image、SDL2_ttf、WolfSSL、MyGameCode、MyGameLibrary、MiscellaneousExternalDependencies.a)组成,并且似乎都能正常编译和运行。我遇到的问题是附加断点并看到 GDB 试图加载关联 .so 的符号(在这种情况下,特别是我的游戏代码)。
我进行了一些测试,发现如果我删除所有游戏代码,我可以只使用我的库和所有其他依赖项来获得断点。我也测试过,发现包括我的大部分游戏文件仍然可以运行。但是我有大约 10 个文件,如果我删除它们,一切似乎都加载得很好。当我的项目有一个允许断点的精简版本时,加载符号大约需要 42 秒。
这似乎是项目中的全部符号,而不是在应用程序生命周期内运行的任何特定代码,因为我在 C++ 中指定了一个主函数,它不会加载我的任何游戏代码,只是运行一个简单的 SDL2 测试,只需通过更改项目中包含的文件数量我可以重现 GDB 崩溃或消除它。
我应该注意,我的项目似乎在没有附加调试器的情况下运行良好,并且我可以看到我试图在其中设置断点的 C++ 模块的输出。我遇到的问题仅限于我尝试连接 GDB 时并通过 Visual Studio 访问断点。那时,在符号加载过程中,我得到了似乎是堆栈溢出(或者可能是超时?)。
我的问题有几个要点:
- GDB 是否有某种符号限制?
- 如果是这样,有没有办法在 Visual Studio 的构建过程中从最终的“.so”中去除未使用的符号?我想让我的构建过程易于执行。
- 如果不是,我可以使用 .so 或 .a 文件以某种方式分解我的项目来解决这个问题吗?如果我这样做,目前似乎没有什么不同,因此我们将不胜感激!
- 如果出现超时,Visual Studio 的 GDB 包装器和 Android 模拟器是否允许我增加超时?如果我可以在 200 秒内指定它,那肯定有足够的时间来加载我的项目的 .so 符号。
- 对于以这种方式加载符号时崩溃有任何其他可能的解释吗?
基本上我不知道为什么它在为我的 .so 文件加载符号时崩溃
我在此处提供了更多详细信息,包括指向我的项目的链接和确切的测试方法,但此问题的全部主旨已在本文中提供。
【问题讨论】:
标签: c++ visual-studio android-ndk gdb clang