Visual Studio-Android-GDB意外退出,退出代码为-1073741571(0xC00000FD):加载符号时

时间:2020-01-29 22:53:07

标签: c++ visual-studio android-ndk gdb clang

我在针对Android的Visual Studio 2019社区版中设置了一个C ++ gradle应用程序。我正在使用NDK 20(Microsoft的android sdk存储库中的最新版本)。

此应用程序由几个.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 Emulator是否可以增加超时?如果我可以在200秒左右指定它,那肯定是足够多的时间来加载项目的.so符号。
  • 对于以这种方式加载符号时发生的崩溃,还有其他可行的解释吗?

基本上我不知道为什么在为我的.so文件加载符号时会崩溃

我在这里提供了更多详细信息,包括指向我的项目的链接和确切的测试方法,但是此问题的全部要点在本文中。

https://developercommunity.visualstudio.com/content/problem/898890/gdb-exited-unexpectedly-with-exit-code-1073741571.html

1 个答案:

答案 0 :(得分:0)

事实证明,将我的Microsoft托管NDK版本20.0.5594570中的gdb.exe和gdb-orig.exe文件替换为我从此处下载的NDK 21下载获得的文件即可解决问题(在撰写本文时,r21): https://developer.android.com/ndk/downloads

必须存在一个缺陷,该缺陷最近已在GDB中解决,并且与我的项目规模和/或组成有关。但是,NDK r21捆绑版的GDB可以完美运行。