Visual Studio - Android - GDB 意外退出,退出代码为 -1073741571 (0xC00000FD):加载符号时
Visual Studio - Android - GDB exited unexpectedly with exit code -1073741571 (0xC00000FD) : While Loading Symbols
我在 Visual Studio 2019 Community Edition 中设置了一个 C++ gradle 应用,目标 Android。我正在使用 NDK 20(Microsoft android sdk 存储库中的最新版本)。
此应用程序由几个 .so 库(SDL2、SDL2_image、SDL2_ttf、WolfSSL、MyGameCode、MyGameLibrary、MiscellaneousExternalDependencies.a)组成,似乎都可以编译并且 运行 正确。我遇到的问题是附加一个断点并看到 GDB 试图加载关联的符号。所以(在这种情况下,我的游戏代码特别)。
我做了一些测试,发现如果我删除所有游戏代码,我可以只使用我的库和所有其他依赖项来设置断点。我也测试过,发现包括我的大部分游戏文件仍然是 运行s。但是我有大约 10 个文件,如果我删除它们,一切似乎都可以正常加载。当我有一个允许命中断点的精简版项目时,加载符号大约需要 42 秒。
它似乎是项目中的全部符号,而不是应用程序生命周期中的任何特定代码 运行ning,因为我在 C++ 中指定了一个主要功能,它不会加载我的任何游戏代码,只是 运行这是一个简单的 SDL2 测试,只需更改项目中包含的文件数量,我就可以重现或消除 GDB 崩溃。
我应该注意到,我的项目似乎 运行 在没有附加调试器的情况下运行良好,而且我可以看到我试图在其中设置断点的 C++ 模块的输出。我遇到的问题仅限于当我尝试连接 GDB 并通过 Visual Studio 访问断点时。那时我在符号加载过程中出现了堆栈溢出(或者可能是超时?)。
我的问题有几个要点:
- GDB 有某种符号限制吗?
- 如果是这样,有没有办法在 Visual Studio 的构建过程中从最终的“.so”中删除未使用的符号?我想让我的构建过程易于执行。
- 如果不是,我可以用 .so 或 .a 文件以某种方式分解我的项目来解决这个问题吗?如果我这样做,目前似乎没有什么不同,所以我们将不胜感激!
- Visual Studio 的 GDB 包装器和 Android 仿真器是否允许我在超时时增加超时?如果我可以将它指定为大约 200 秒,那肯定有足够的时间来加载我的项目的 .so 符号。
- 是否有任何其他可能的解释以这种方式加载符号时崩溃并具有合理的解决方法?
基本上我不知道为什么它在为我的 .so 文件加载符号时崩溃
我在此处提供了更多详细信息,包括 link 我的项目和确切的测试方法,但这个问题的全部要点都在 post。
事实证明,将我的 Microsoft 托管 NDK 版本 20.0.5594570 中的 gdb.exe 和 gdb-orig.exe 文件替换为我从此处下载 NDK 21 获得的文件解决了问题(r21 在写作时间):https://developer.android.com/ndk/downloads
一定有一个缺陷最近已在 GDB 本身中解决,并且与我的项目大小 and/or 组合有问题。然而,NDK r21 捆绑版本的 GDB 工作完美。
我在 Visual Studio 2019 Community Edition 中设置了一个 C++ gradle 应用,目标 Android。我正在使用 NDK 20(Microsoft android sdk 存储库中的最新版本)。
此应用程序由几个 .so 库(SDL2、SDL2_image、SDL2_ttf、WolfSSL、MyGameCode、MyGameLibrary、MiscellaneousExternalDependencies.a)组成,似乎都可以编译并且 运行 正确。我遇到的问题是附加一个断点并看到 GDB 试图加载关联的符号。所以(在这种情况下,我的游戏代码特别)。
我做了一些测试,发现如果我删除所有游戏代码,我可以只使用我的库和所有其他依赖项来设置断点。我也测试过,发现包括我的大部分游戏文件仍然是 运行s。但是我有大约 10 个文件,如果我删除它们,一切似乎都可以正常加载。当我有一个允许命中断点的精简版项目时,加载符号大约需要 42 秒。
它似乎是项目中的全部符号,而不是应用程序生命周期中的任何特定代码 运行ning,因为我在 C++ 中指定了一个主要功能,它不会加载我的任何游戏代码,只是 运行这是一个简单的 SDL2 测试,只需更改项目中包含的文件数量,我就可以重现或消除 GDB 崩溃。
我应该注意到,我的项目似乎 运行 在没有附加调试器的情况下运行良好,而且我可以看到我试图在其中设置断点的 C++ 模块的输出。我遇到的问题仅限于当我尝试连接 GDB 并通过 Visual Studio 访问断点时。那时我在符号加载过程中出现了堆栈溢出(或者可能是超时?)。
我的问题有几个要点:
- GDB 有某种符号限制吗?
- 如果是这样,有没有办法在 Visual Studio 的构建过程中从最终的“.so”中删除未使用的符号?我想让我的构建过程易于执行。
- 如果不是,我可以用 .so 或 .a 文件以某种方式分解我的项目来解决这个问题吗?如果我这样做,目前似乎没有什么不同,所以我们将不胜感激!
- Visual Studio 的 GDB 包装器和 Android 仿真器是否允许我在超时时增加超时?如果我可以将它指定为大约 200 秒,那肯定有足够的时间来加载我的项目的 .so 符号。
- 是否有任何其他可能的解释以这种方式加载符号时崩溃并具有合理的解决方法?
基本上我不知道为什么它在为我的 .so 文件加载符号时崩溃
我在此处提供了更多详细信息,包括 link 我的项目和确切的测试方法,但这个问题的全部要点都在 post。
事实证明,将我的 Microsoft 托管 NDK 版本 20.0.5594570 中的 gdb.exe 和 gdb-orig.exe 文件替换为我从此处下载 NDK 21 获得的文件解决了问题(r21 在写作时间):https://developer.android.com/ndk/downloads
一定有一个缺陷最近已在 GDB 本身中解决,并且与我的项目大小 and/or 组合有问题。然而,NDK r21 捆绑版本的 GDB 工作完美。